bash通过引用间接引用

Cra*_*ck9 1 variables bash

很多类似的问题,但没有找到一个在名称中使用变量的方式:

#!/bin/bash

# $1 should be 'dev' or 'stg'

dev_path="/path/to/123"
stg_path="/path/to/xyz"

# Use $1 as input to determine which path variable to 'execute'
${!\$1'/morepath'}
Run Code Online (Sandbox Code Playgroud)

使用$ 1,我希望能够引用$ dev_path或$ stg_path($ 1 =='dev'或$ 1 =='stg')并且能够引用$ 1_path的值,该值为'/ path/to/123'或'/ path/to/xyz'

所以结果要么是:

'/path/to/123/morepath' or '/path/to/xyz/morepath'
Run Code Online (Sandbox Code Playgroud)

基于$ 1为'dev'或'stg'.

我尝试了各种迭代!和\ $在其他帖子的各个地方,但没有运气

Ada*_*eld 6

有关shell参数扩展的信息,请参阅Bash手册部分:

如果参数的第一个字符是感叹号(!),则引入一个变量间接的级别.Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值.这被称为indirect expansion.对此的例外是以下的扩展${!prefix }${!name[@]}描述.感叹号必须紧跟左支撑,以引入间接.

[...]

由于您还希望_path在再次展开之前修改名称(通过后缀),因此您需要浏览另一个变量:

# $1 should be 'dev' or 'stg'
dev_path="/path/to/dev"
stg_path="/path/to/stg"

path=${1}_path   # path is now either 'dev_path' or 'stg_path'

# Run either /path/to/dev or /path/to/stg
${!path}/bin/execute
Run Code Online (Sandbox Code Playgroud)

当然,如果两个devstg程序都在同一个目录中,那么就不需要这一切了,你可以直接扩展$1:

/path/to/$1/bin/execute
Run Code Online (Sandbox Code Playgroud)