Bourne Shell Building и ссылка на переменную - PullRequest
3 голосов
/ 11 сентября 2010

У меня есть оболочка, которая запускается там, где предустановленные переменные env включают:

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

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 11 сентября 2010

Ключ 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

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

1 голос
/ 11 сентября 2010

Вам понадобится 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

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

0 голосов
/ 11 сентября 2010

Прошло очень много времени с тех пор, как я создал какую-либо оболочку Bourne, но вы пробовали команду eval?

...