Bourne Shell构建和引用变量

Bourne Shell构建和引用变量,shell,sh,Shell,Sh,我有一个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 s

我有一个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
count=$FOOCOUNT
计数器=0
而[$计数器-lt$计数]
做
#我正在查找以下内容的语法:
计数器=`expr$计数器+1`
echo“问候#$counter:Hello,${myconstructedvar}”
完成

非常感谢

我已经很久没有做任何Bourne shell了,但是你试过eval命令吗?

你需要一个
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
中没有字符),那么您可以使用shell的空参数折叠功能,并且:

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

并允许shell忽略未设置的
foo_x

键是
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。

这太完美了。我不熟悉eval,但是eval myVar=\$${myConstructedVar}工作得很好。非常感谢!