我想更改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
答案 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
正如其他人所说,阵列可能是更好的解决方案。