在循环中更改bash变量名称

时间:2018-01-08 02:41:07

标签: bash

我想更改bash循环中使用的变量。我希望第一次迭代回显“/ path / to / lol / hello_foo”,第二次回复“/ path / to / lol / hello_bar”。

但相反,打印出来了:

/path/to/lol/fname_one
/path/to/lol/fname_two

以下是代码:

#!/bin/bash                                                                                                                                                                                                                                                                              

path_data='/path/to/lol'
fname_one='hello_foo'
fname_two='hello_bar'

for count in one two
do
    echo $path_data/fname_$count
done

3 个答案:

答案 0 :(得分:2)

请参阅"How can I use variable variables (indirect variables, pointers, references) or associative arrays?"

您的脚本看起来像这样,

 #!/bin/bash   

 path_data='/path/to/lol'
 fname_one='hello_foo'
 fname_two='hello_bar'

 for count in one two
 do
   _tmpf="fname_$count"
   echo "$path_data/${!_tmpf}" 
 done

结果:

~]# ./test.sh 
/path/to/lol/hello_foo
/path/to/lol/hello_bar

答案 1 :(得分:1)

您可以使用间接变量扩展来执行此操作:

...
fname_var=fname_$count
echo "$path_data/${!fname_var}"    # Quoting variable references is a good idea
...

但是对于像这样的事情使用数组通常会更好:

#!/bin/bash

path_data='/path/to/lol'
declare -a fname    # Make fname an array, rather than a plain variable
fname[1]='hello_foo'
fname[2]='hello_bar'

for count in 1 2
do
    echo "$path_data/${fname[count]}"
done

如果需要文本(非数字)索引,可以使用关联数组(仅限bash v4):

#!/bin/bash

path_data='/path/to/lol'
declare -A fname    # Capital -A makes an associaltive array
fname[one]='hello_foo'
fname[two]='hello_bar'

for count in one two
do
    echo "$path_data/${fname[$count]}"
done

答案 2 :(得分:1)

您可以使用eval执行此操作(与其他一些答案相比,这可能已过时)

#!/bin/bash

path_data='/path/to/lol'
fname_one='hello_foo'
fname_two='hello_bar'

for count in one two
do
    varname=fname_$count
    eval "varval=$"$varname
    echo $path_data/$varval
done

正如其他人所说,阵列可能是更好的解决方案。