3

事前設定された環境変数に含まれる場所で実行されるシェルがあります。

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

ループ演算は古いものです-私がコードを書く方法です。最近のシェルにはより多くの算術演算が組み込まれていますが、質問にはBourneシェルのタグが付けられています。

于 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>)、シェルのnull引数の折りたたみ機能を使用できます。

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

シェルが未設定を無視できるようにしますfoo_x

于 2010-09-11T15:09:42.457 に答える
0

Bourneシェルを実行してから非常に長い時間が経ちましたが、evalコマンドを試しましたか?

于 2010-09-11T15:07:09.927 に答える