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:
-
evalexecuta 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,letpode ser usado para operações aritméticas:let a="1 + 2"é equivalente a
a=3.