Призначення змінної має вигляд імені змінної, за яким слідує знак рівності, за яким слід (необов'язково) значення.
Це дійсне завдання:
ABC=123
"$x"1=1
не є дійсним призначенням, оскільки "$x"1
це не ім'я змінної. Це може бути Eval закінчив інститут по імені змінної, але це не так . Справжня оболонка вважає, що це команда.
Один із способів зробити те, що ви хочете досягти, це такий:
eval "$x"1=1
Інший спосіб в башті (але не в інших оболонках):
declare "$x"1=1
Або також (знову лише для удару):
let "$x"1=1
(У вашому випадку немає великої різниці.)
Але, як зазначив Джакує в коментарях , ви, мабуть, хочете перейти з масивами, якщо у вашій оболонці є (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
.