Присвоение переменной имеет вид имени переменной, за которым следует знак равенства, за которым следует (необязательное) значение.
Это действительное назначение:
ABC=123
"$x"1=1
не является допустимым назначением, потому что "$x"1
не является именем переменной. Это может быть Eval закончил институт по имени переменной, но это не так . Оболочка, на самом деле, считает, что это команда.
Один из способов сделать то, что вы хотите достичь, это:
eval "$x"1=1
Другой способ в bash (но не в других оболочках):
declare "$x"1=1
Или также (снова только bash):
let "$x"1=1
(В вашем случае нет большой разницы.)
Но, как отметил Jakuje в комментариях , вы, вероятно, захотите использовать массивы, если они есть в вашей оболочке (ksh, bash или zsh).
Для полноты:
eval
выполняет произвольные команды. Таким образом, если справа от знака равенства у вас есть переменная, которая расширяется до некоторой команды, эта команда будет выполнена. Следующий код:
x=a
y='$(echo hello)'
eval "$x=$y"
эквивалентно a=hello
.
declare
является встроенным в bash для назначения переменных и не выполняет никаких команд. Следующий код:
x=a
y='$(echo hello)'
declare "$x=$y"
эквивалентно a='$(echo hello)'
.
let
похоже на то declare
, что он не выполняет команды. Но вопреки declare
, let
может использоваться для арифметических операций:
let a="1 + 2"
эквивалентно a=3
.