如何在echo中使用double $

sud*_*aju 9 linux bash shell

[sudhir.tataraju.WBLL0717E4418] ? cat test.sh

#!bin/bash

i=2

value2=abc

echo "`$value$i`"
Run Code Online (Sandbox Code Playgroud)

输出:

[sudhir.tataraju.WBLL0717E4418] ? sh test.sh
test.sh: line 8: 2: command not found
Run Code Online (Sandbox Code Playgroud)

调试输出:

[sudhir.tataraju.WBLL0717E4418] ? sh -x test.sh
+ i=2
+ value2=abc
++ 2
test.sh: line 8: 2: command not found
+ echo ''
Run Code Online (Sandbox Code Playgroud)

如何获得输出abc没有错误?

Pes*_*The 6

使用数组可以更好地实现您要做的事情.

values=( value1 value2 value3 "This is value 4" )
echo "${values[2]}"
values[2]="other_value"
echo "${values[2]}"
Run Code Online (Sandbox Code Playgroud)

变量也可以用作索引:

i=2
echo "${values[$i]}"
Run Code Online (Sandbox Code Playgroud)

数组很容易在值上循环:

#looping over values
for value in "${values[@]}"; do
    echo "$value"
done
#looping over indexes
for index in "${!values[@]}"; do
    echo "${values[$index]}"
done
Run Code Online (Sandbox Code Playgroud)

如果您不考虑稀疏或关联数组,您也可以像这样循环:

for (( index=0; index<${#values[@]}; index++ )); do
    echo "${values[index]}"
done
Run Code Online (Sandbox Code Playgroud)

数组是适合您任务的正确结构.它们提供强大的功能.有关数组的更多信息,请参阅:wiki.bash-hackers.org/syntax/arraysBash参考手册.


gni*_*urf 6

您要求的可以通过两种方式实现(没有反模式或eval).

  1. 使用间接扩展:

    参数扩展的基本形式是${parameter}.参数的值被替换.[...] 如果参数的第一个字符是感叹号(!),它引入了一个变量间接的级别.Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值.这被称为间接扩张.

    所以你想要的是:

    #!/bin/bash
    
    i=2
    
    value2=abc
    
    # Have a variable that expands to the name of the variable you want
    myvar=value$i
    
    # Use indirect expansion
    echo "${!myvar}"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 意识到你的设计非常糟糕,并使用一些适当的结构:Bash处理数组.见Pesa的回答.在您的情况下,这绝对是推荐的方法.


不要用eval.虽然它看起来很棒,但在了解所有问题之前,需要大量的shell脚本练习eval.当你有足够的Bash经验时,你会意识到你很少需要eval.


ope*_*kix -2

这是一个完整的有效示例

#!/bin/bash

val1='foo'
val2='bar' 
val3='baz'

for i in {1..3}
do
  eval echo "\$val${i}"
done
Run Code Online (Sandbox Code Playgroud)

  • 对我来说似乎是[iBug的答案](/sf/answers/3362948081/)的重复。另外,您可以使用“{1..3}”或至少使用“$(cmd)”。 (3认同)