我有一个shell,它运行预设的env变量包括:
FOOCOUNT=4
FOO_0=John
FOO_1=Barry
FOO_2=Lenny
FOO_3=Samuel
我无法改变获取此数据的方式。
我想运行一个循环来生成变量并使用内容。
echo "Hello $FOO_count"
然而,这种语法是错误的,这就是我要搜索的内容......
count=$FOOCOUNT
counter=0
while [ $counter -lt $count ]
do
#I am looking for the syntax for: <<myContructedVar= $ + 'FOO_' + $counter>>
counter=`expr $counter + 1`
echo "Greeting #$counter: Hello, ${myContructedVar}."
done
非常感谢
答案 0 :(得分:2)
关键是eval
:
count=$FOOCOUNT
counter=0
while [ $counter -lt $count ]
do
myConstructedVar=FOO_$counter
counter=`expr $counter + 1`
echo "Greeting #$counter: Hello, `eval echo \$${myConstructedVar}`."
done
循环算术是老派 - 我编写代码的方式。现代shell内置了更多算术 - 但问题是标记为Bourne shell。
答案 1 :(得分:1)
你需要一个eval
和一个延迟的印记:
$ foo_0=john
$ count=0
$ name="\$foo_$count"
$ echo $name
$foo_0
$ eval echo "$name"
john
但除非索引对您真正重要,否则您可以使用
for i in "$foo_0" "$foo_1" "$foo_2" ... ; do
...
done
并摆脱名称错误的伪数组。并且,如果您有foo_x
和的数量的上限,则各种foos中没有特殊字符(特别是$IFS
中没有默认值的字符到<space><tab><return>
)然后你可以使用shell的null-argument collapsing功能:
$ for i in $foo_0 $foo_1 $foo_2 ; do
> echo '***' $i
> done
*** john
并允许shell忽略未设置的foo_x
答案 2 :(得分:0)
我做了任何Bourne shell已经很长时间了但是你试过eval命令吗?