以下 bash 命令替换不像我想的那样工作。
echo $TMUX_$(echo 1)
只打印 1 并且我期待变量的值$TMUX_1
。我也尝试过:
echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution
有什么建议么 ?
以下 bash 命令替换不像我想的那样工作。
echo $TMUX_$(echo 1)
只打印 1 并且我期待变量的值$TMUX_1
。我也尝试过:
echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution
有什么建议么 ?
如果我正确理解您要查找的内容,那么您正在尝试以编程方式构造一个变量名,然后访问该变量的值。做这种事情通常需要一个eval
声明:
eval "echo \$TMUX_$(echo 1)"
该语句的重要功能包括使用双引号,以便$( )
正确地将其解释为命令替换,以及对第一个进行转义,$
以便第一次不会对其进行评估。实现相同目的的另一种方法是
eval 'echo $TMUX_'"$(echo 1)"
在这种情况下,我使用了两个自动连接的字符串。第一个是单引号,因此一开始不会对其进行评估。
该要求有一个例外eval
:Bash 有一种间接引用方法,${!name}
当您想将变量的内容用作变量名时。您可以按如下方式使用它:
tmux_var = "TMUX_$(echo 1)"
echo ${!tmux_var}
不过,我不确定是否有办法在一个语句中做到这一点,因为您必须有一个命名变量才能使其工作。
PS我假设这echo 1
只是一些更复杂命令的替身;-)
您在寻找数组吗?Bash 有它们。在 bash 中有多种创建和使用数组的方法,强烈推荐使用 bash 手册页中有关数组的部分。这是一个代码示例:
TMUX=( "zero", "one", "two" )
echo ${TMUX[2]}
在这种情况下,结果当然是两个。
以下是 bash 手册页中的几行简短内容:
Bash provides one-dimensional indexed and associative array variables. Any variable may be
used as an indexed array; the declare builtin will explicitly declare an array. There is
no maximum limit on the size of an array, nor any requirement that members be indexed or
assigned contiguously. Indexed arrays are referenced using integers (including arithmetic
expressions) and are zero-based; associative arrays are referenced using arbitrary
strings.
An indexed array is created automatically if any variable is assigned to using the syntax
name[subscript]=value. The subscript is treated as an arithmetic expression that must
evaluate to a number greater than or equal to zero. To explicitly declare an indexed
array, use declare -a name (see SHELL BUILTIN COMMANDS below). declare -a name[subscript]
is also accepted; the subscript is ignored.
这有效(经过测试):
eval echo \$TMUX_`echo 1`
不过可能不是很清楚。可以肯定的是,任何解决方案都需要在回声周围加上反引号才能使其正常工作。