Я хочу динамически создавать последовательность строк, манипулируя массивом элементов и создавая некоторую арифметическую процедуру.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "\n"
done
Желание результата будет ниже для $6
равных 0
.
1q;d
2q;d
3q;d
4q;d
5q;d
Но я получаю эту ошибку
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
Я думаю, это что-то простое. Раньше работал когда я делал что-то вроде
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
FIRST=$(( $6 + 1 ))
Ответы:
Прежде всего, не может быть пробела
=
в объявлении переменной вbash
.Чтобы получить то, что вы хотите, вы можете использовать
eval
.Например пример скрипта, подобного вашему:
Печать:
Используйте с
eval
осторожностью, некоторые люди называют это злом по какой-то уважительной причине.declare
будет работать тоже:также печатает:
источник
!
нужен восклицательный знакprintf '%s\n' "${!name}"
?bash
параметра ..declare
/eval
:printf -v varname '%fmt' args
. Некоторые внутренние функции завершения bash используют это для вызова по ссылке. (передать имя переменной для хранения).declare
только устанавливает переменную в локальной области, в то время какeval
подход устанавливает ее глобально.Если вы хотите сослаться на переменную bash, сохраняя имя в другой переменной, вы можете сделать это следующим образом:
В этом случае вы сохраняете имя переменной, к которой хотите получить доступ, например, var2. Затем вы обращаетесь к нему с помощью переменной
${!<varable name>}
where<variable name>
, содержащей имя переменной, к которой вы хотите получить доступ.источник
eval var=\$$holder
ноeval
это опасно!Это то, что вы пытаетесь?
источник
Что я получаю из вашего кода и желаемого результата (поправьте меня, если я ошибаюсь):
имена переменных "FIRST" / "SECOND" / ... не используются, вам просто нужен цикл с индексом .. ,
Это сделает работу:
for i in {1..5} ; do echo $i"q;d" ; done
источник
SUM=$(($6 + $i)); echo $SUM"q;d"
Я вижу, что я делаю неправильно.