Что не так с этим скриптом? Я пытаюсь определить A1 = 1, B1 = 1, C1 = 1
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
и результат:
./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found
shell-script
variable
Аке Бломберг
источник
источник
eval "$x"1=1
. Хотя, как отметил Jakuje, массивы, вероятно, лучше подходят для этого случая.Ответы:
Присвоение переменной имеет вид имени переменной, за которым следует знак равенства, за которым следует (необязательное) значение.
Это действительное назначение:
"$x"1=1
не является допустимым назначением, потому что"$x"1
не является именем переменной. Это может быть Eval закончил институт по имени переменной, но это не так . Оболочка, на самом деле, считает, что это команда.Один из способов сделать то, что вы хотите достичь, это:
Другой способ в bash (но не в других оболочках):
Или также (снова только bash):
(В вашем случае нет большой разницы.)
Но, как отметил Jakuje в комментариях , вы, вероятно, захотите использовать массивы, если они есть в вашей оболочке (ksh, bash или zsh).
Для полноты:
eval
выполняет произвольные команды. Таким образом, если справа от знака равенства у вас есть переменная, которая расширяется до некоторой команды, эта команда будет выполнена. Следующий код:эквивалентно
a=hello
.declare
является встроенным в bash для назначения переменных и не выполняет никаких команд. Следующий код:эквивалентно
a='$(echo hello)'
.let
похоже на тоdeclare
, что он не выполняет команды. Но вопрекиdeclare
,let
может использоваться для арифметических операций:эквивалентно
a=3
.источник
ABC = 123
недействительно. Потому что пространство добавляется до и послеequal(=)
знака.В bash FAQ есть запись о косвенности. В большинстве случаев вы должны использовать ассоциативный или индексированный массив. Вы также можете использовать
Посмотрите в этом разделе часто задаваемые вопросы больше возможностей для этого, избегая при этом беспорядочного
eval
цитирования.источник
Вы можете использовать код, как показано ниже. В вашем коде оболочка выполняется
"$x"1=1
как команда, потому что она не является допустимым назначением переменной.источник
command not found <varname>=1
когда пытаюсь это сделать (очевидно, с <varname>, являющимся значением, в котором я хранилa
)echo
здесь не нужно ! Простоa="$x"1
. Такжеlet
является арифметическим контекстом, поэтому вы можете назначать только числа с ним.declare $a=foobar
работает.