2010-09-11 79 views
3

我有一個運行在預設的ENV變量包括一個殼:Bourne 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 

非常感謝

回答

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。

+0

這是完美的。我不熟悉eval,但eval myVar = \ $$ {myConstructedVar}完美運作。非常感謝! – 2010-09-11 19:14:52

0

這是一個很長的時間,因爲我做了任何諜影重重殼,但你有沒有嘗試過eval命令?

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>),則可以使用空參數摺疊功能殼和的:

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

,並允許外殼忽略未設置foo_x