использование переменной для создания имени переменной в сценарии оболочки

#shell

#оболочка

Вопрос:

Я хочу повторить $ANMIAL0, а затем $ANIMAL1, используя приведенный ниже скрипт. Но я получаю line 7: ${ANIMAL$i}: bad substitution сообщение об ошибке. Что не так?

 #!/bin/sh
ANIMAL0="tiger"
ANIMAL1="lion"
i=0
while test $i -lt 2; do
echo "Hey $i !"
echo ${ANIMAL$i}
i=`expr $i   1`
done
 

Ответ №1:

Вероятно, вам лучше использовать массив вместо ANIMAL0 and ANIMAL1 . Может быть, что-то вроде этого?

 #!/bin/bash

animals=("Tiger" "Lion")

for animal in ${animals[*]}
do
    printf "Hey, ${animal} n"
done
 

Использование eval приведет к неприятностям в будущем и не является лучшей практикой для того, что вы пытаетесь сделать.

Комментарии:

1. Что ж, если вы в конечном итоге используете этот метод вместо этого, пожалуйста, отметьте это как правильный ответ. Кроме этого, рад помочь 🙂

Ответ №2:

Проблема в том, что оболочка обычно выполняет один проход подстановки. Вы можете принудительно выполнить второй проход с eval помощью , но это, очевидно, связано с обычными предостережениями безопасности (не оценивайте непроверенный пользовательский ввод и т. Д.).

 eval echo $ANIMAL$i
 

Bash имеет различные конструкции, которые помогут избежать eval .

Ответ №3:

Вы можете использовать eval

 eval echo $ANIMAL$i