Bourne Shell构建并引用变量

时间:2010-09-11 14:50:45

标签: shell sh

我有一个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

非常感谢

3 个答案:

答案 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命令吗?