3

我有一个运行在预设环境变量中的 shell:

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

非常感谢

4

3 回答 3

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。

于 2010-09-11T15:12:37.327 回答
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 并且在各种 foo 中没有特殊字符(特别是没有$IFS默认为 的字符<space><tab><return>),那么您可以使用 shell 的空参数折叠功能,并且:

$ for i in $foo_0 $foo_1 $foo_2 ; do
> echo '***' $i
> done
*** john

并允许外壳忽略未设置foo_x

于 2010-09-11T15:09:42.457 回答
0

自从我完成任何 Bourne shell 以来已经很长时间了,但是您尝试过 eval 命令吗?

于 2010-09-11T15:07:09.927 回答