如何在echo中使用double $

时间:2017-12-31 11:13:14

标签: linux bash shell

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

#!bin/bash

i=2

value2=abc

echo "`$value$i`"

输出:

[sudhir.tataraju.WBLL0717E4418] ➤ sh test.sh
test.sh: line 8: 2: command not found

调试输出:

[sudhir.tataraju.WBLL0717E4418] ➤ sh -x test.sh
+ i=2
+ value2=abc
++ 2
test.sh: line 8: 2: command not found
+ echo ''

如何输出 abc 而不出错?

5 个答案:

答案 0 :(得分:6)

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

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

变量也可以用作索引:

i=2
echo "${values[$i]}"

数组很容易在值上循环:

#looping over values
for value in "${values[@]}"; do
    echo "$value"
done
#looping over indexes
for index in "${!values[@]}"; do
    echo "${values[$index]}"
done

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

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

数组是适合您任务的正确结构。它们提供强大的功能。有关数组的详细信息,请参阅:wiki.bash-hackers.org/syntax/arraysBash Reference Manual

答案 1 :(得分:6)

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

  1. 使用indirect expansion

      

    参数扩展的基本形式是${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}"
    
  2. 意识到你的设计非常糟糕,而是使用一些适当的结构:Bash处理数组。见PesaThe's answer。在您的情况下,这绝对是推荐的方法。

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

答案 2 :(得分:0)

另一种解决方案,使用 nameref

i=2
value2="abc"
declare -n essai=value"$i"
echo "$essai"

答案 3 :(得分:-1)

使用eval

eval echo "\$value$i"

来自help eval

  
eval: eval [arg ...]  
   Execute arguments as a shell command.

   Combine ARGs into a single string, use the result as input to the shell,  
   and execute the resulting commands.

因此命令首先扩展为

eval echo "$value2"

请注意,第一个美元已转义,因此不会展开为$value

然后eval生效:再次评估整个命令:

echo "abc"

根据需要输出:abc

答案 4 :(得分:-3)

这是一个有效的完整示例

#!/bin/bash

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

for i in {1..3}
do
  eval echo "\$val${i}"
done