O que há de errado com esse script? Estou tentando definir A1 = 1, B1 = 1, C1 = 1
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
e o resultado é:
./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found
shell-script
variable
Ake Blomberg
fonte
fonte
eval "$x"1=1
. Embora, como Jakuje observou, as matrizes provavelmente sejam mais adequadas para este caso.Respostas:
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:
"$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:
Outra maneira no bash (mas não em outras conchas) é:
Ou também (novamente apenas para o bash):
(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:é equivalente a
a=hello
.declare
é um bash embutido para atribuir variáveis e não executa nenhum comando. O código a seguir:é equivalente a
a='$(echo hello)'
.let
é semelhante aodeclare
fato de não executar comandos. Masdeclare
, ao contrário de ,let
pode ser usado para operações aritméticas:é equivalente a
a=3
.fonte
ABC = 123
é inválido. Porque o espaço é adicionado antes e depois doequal(=)
sinal.O FAQ do bash tem uma entrada indireta. Na maioria dos casos de uso, o que você realmente deve fazer é usar uma matriz associativa ou indexada. Você também pode usar
Consulte a entrada das Perguntas frequentes para obter mais opções para fazer isso, evitando ainda
eval
citações confusas .fonte
Você pode usar código como a seguir. No seu código, o shell é executado
"$x"1=1
como um comando porque não é uma atribuição de variável válida.fonte
command not found <varname>=1
quando tento fazer isso (obviamente com o <varname> sendo o valor I armazenada ema
)echo
aqui! Apenasa="$x"1
. Tambémlet
é um contexto aritmético, portanto, você só pode atribuir números com ele.declare $a=foobar
trabalho.