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 atribuição 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 uated para um nome de variável, mas não é. O shell, de fato, acredita que é um comando.
Uma maneira de fazer o que você deseja alcançar é o seguinte:
eval "$x"1=1
Outra maneira no bash (mas não em outras conchas) é:
declare "$x"1=1
Ou também (novamente apenas para o bash):
let "$x"1=1
(Não há muita diferença no seu caso.)
Mas, como Jakuje observou nos comentários , você provavelmente deseja usar arrays, se o seu shell os possuir (ksh, bash ou zsh).
Para completar:
eval
executa comandos arbitrários. Portanto, 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 executa nenhum comando. O código a seguir:
x=a
y='$(echo hello)'
declare "$x=$y"
é equivalente a a='$(echo hello)'
.
let
é semelhante ao declare
fato de não executar comandos. Mas declare
, ao contrário de , let
pode ser usado para operações aritméticas:
let a="1 + 2"
é equivalente a a=3
.