0

以下 bash 命令替换不像我想的那样工作。

echo $TMUX_$(echo 1)

只打印 1 并且我期待变量的值$TMUX_1。我也尝试过:

echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution

有什么建议么 ?

4

3 回答 3

1

如果我正确理解您要查找的内容,那么您正在尝试以编程方式构造一个变量名,然后访问该变量的值。做这种事情通常需要一个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只是一些更复杂命令的替身;-)

于 2011-09-11T02:41:32.363 回答
0

您在寻找数组吗?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.
于 2011-09-11T02:30:04.510 回答
0

这有效(经过测试):

eval echo \$TMUX_`echo 1`

不过可能不是很清楚。可以肯定的是,任何解决方案都需要在回声周围加上反引号才能使其正常工作。

于 2011-09-11T02:41:12.787 回答