Uma atribuição de variável tem a forma de um nome de variável, seguido pelo sinal de igual, seguido pelo valor (opcional).
Esta é uma tarefa válida:
ABC=123
"$x"1=1
não é uma atribuição válida, porque "$x"1
não é um nome de variável. Pode ser eval uado para um nome de variável, mas não é. A casca, na verdade, acredita que é um comando.
Uma maneira de fazer o que você quer alcançar é esta:
eval "$x"1=1
Outra maneira de bash (mas não em outras shells) é:
declare "$x"1=1
Ou também (novamente bash-only):
let "$x"1=1
(Não há muita diferença no seu caso.)
Mas, como Jakuje anotado no comments , você provavelmente quer ir com arrays, se o seu shell tiver eles (ksh, bash ou zsh).
Para completar:
-
eval
executa comandos arbitrários. Então, se no lado direito do sinal de igual você tiver uma variável que se expande para algum comando, esse comando será executado. O código a seguir:x=a y='$(echo hello)' eval "$x=$y"
é equivalente a
a=hello
. -
declare
é um bash embutido para atribuir variáveis e não executará nenhum comando. O código a seguir:x=a y='$(echo hello)' declare "$x=$y"
é equivalente a
a='$(echo hello)'
. -
let
é semelhante adeclare
, pois não executa comandos. Mas ao contrário dedeclare
,let
pode ser usado para operações aritméticas:let a="1 + 2"
é equivalente a
a=3
.