2010-09-11 5 views
3

У меня есть оболочка, которая работает где предустановленная переменная Env включает в себя:Bourne Shell Building и ссылки на переменные

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 

Арифметика цикла - это старая школа - то, как я пишу код. Современные оболочки имеют больше арифметических встроенных, но вопрос помечен оболочкой Bourne.

+0

Это идеальное решение. Я не был знаком с eval, но eval myVar = \ $$ {myConstructedVar} работал отлично. Спасибо большое! –

0

Это было очень давно, так как я сделал любой Bourne но вы попробовали команду 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 

и избавиться от плохо имени псевдо -array. И, если у вас есть верхняя граница номера числа и, то в различных foos нет специальных символов (в частности, нет символа в $IFS, который по умолчанию равен <space><tab><return>), то вы можете использовать функцию свертывания с нулевым аргументом оболочки и:

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

и позволяют оболочке игнорировать незадан foo_x

Смежные вопросы