bash命令扩展

时间:2011-09-11 02:08:45

标签: bash shell variable-expansion

以下bash命令替换不起作用。

echo $TMUX_$(echo 1)

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

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

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您正在寻找的内容,那么您正在尝试以编程方式构造变量名称,然后访问该变量的值。做这种事情通常需要eval声明:

eval "echo \$TMUX_$(echo 1)"

此语句的重要功能包括使用双引号,以便$( )被正确解释为命令替换,以及第一个$的转义,以便它不会被获取第一次评估。实现同样目标的另一种方法是

eval 'echo $TMUX_'"$(echo 1)"

在这种情况下,我使用了两个自动连接的字符串。第一个是单引号,因此最初不进行评估。

eval要求有一个例外:当您想要将变量的内容用作变量名时,Bash有一种间接引用方法${!name}。您可以按如下方式使用它:

tmux_var = "TMUX_$(echo 1)"
echo ${!tmux_var}

我不确定是否有办法在一个语句中执行此操作,因为您必须有一个命名变量才能使用。

P.S。我假设echo 1只是一个更复杂的命令的替身; - )

答案 1 :(得分: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.

答案 2 :(得分:0)

这有效(经过测试):

eval echo \$TMUX_`echo 1`

可能不太清楚。非常确定任何解决方案都需要在回声周围进行反引才才能实现。

相关问题