¿Qué hay de malo con este script? Estoy tratando de definir A1 = 1, B1 = 1, C1 = 1
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
y el resultado es:
./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
fuente
fuente
eval "$x"1=1
. Aunque, como señaló Jakuje, las matrices probablemente sean más adecuadas para este caso.Respuestas:
Una asignación de variable tiene la forma de un nombre de variable, seguido del signo igual, seguido del valor (opcional).
Esta es una tarea válida:
"$x"1=1
no es una asignación válida, porque"$x"1
no es un nombre de variable. Puede ser eval uated a un nombre de variable, pero no lo es. El caparazón, de hecho, cree que es un comando.Una forma de hacer lo que quieres lograr es esta:
Otra forma en bash (pero no en otros shells) es:
O también (de nuevo bash-only):
(No hay mucha diferencia en su caso).
Pero, como señaló Jakuje en los comentarios , es probable que desee ir con matrices, si su shell las tiene (ksh, bash o zsh).
Por completitud:
eval
ejecuta comandos arbitrarios. Entonces, si en el lado derecho del signo igual tiene una variable que se expande a algún comando, ese comando se ejecutará. El siguiente código:es equivalente a
a=hello
.declare
es un bash incorporado para asignar variables y no ejecutará ningún comando. El siguiente código:es equivalente a
a='$(echo hello)'
.let
es similar adeclare
que no ejecuta comandos. Pero al contrario dedeclare
,let
puede usarse para operaciones aritméticas:es equivalente a
a=3
.fuente
ABC = 123
es inválido. Porque se agrega espacio antes y después de laequal(=)
señal.Las preguntas frecuentes de bash tienen una entrada sobre indirección. En la mayoría de los casos de uso, lo que debería hacer es usar una matriz asociativa o indexada. También puedes usar
Consulte la entrada de Preguntas frecuentes para obtener más opciones para hacer esto y evitar las citas desordenadas
eval
.fuente
Puedes usar código como el siguiente. En su shell de código se ejecuta
"$x"1=1
como un comando porque no es una asignación de variable válida.fuente
command not found <varname>=1
cuando intento hacer eso (obviamente con <varname> es el valor que almacenéa
)echo
aquí! Justoa="$x"1
. Tambiénlet
es un contexto aritmético, por lo que solo puede asignar números con él.declare $a=foobar
trabajos.