Quiero crear dinámicamente una secuencia de cadenas mediante la manipulación de una matriz de elementos y crear algún procedimiento aritmético.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "\n"
done
El resultado deseado sería el siguiente para $6
iguales 0
.
1q;d
2q;d
3q;d
4q;d
5q;d
Pero me sale este error
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
Supongo que es algo simple. Solía funcionar cuando hacía algo como
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
FIRST=$(( $6 + 1 ))
Respuestas:
En primer lugar, no puede haber ningún espacio alrededor
=
en la declaración de variables enbash
.Para obtener lo que quieres puedes usar
eval
.Por ejemplo, un script de muestra como el tuyo:
Impresiones:
Use con
eval
precaución, algunas personas lo llaman malvado por alguna razón válida.declare
funcionaría también:también imprime:
fuente
!
signo de exclamaciónprintf '%s\n' "${!name}"
?bash
parámetrosdeclare
/eval
:printf -v varname '%fmt' args
. Algunas funciones internas de finalización de bash lo usan para llamar por referencia. (pase el nombre de una variable para almacenar).declare
solo establece la variable en el ámbito local, mientras que eleval
enfoque la establece globalmente.Si desea hacer referencia a una variable bash mientras tiene el nombre almacenado en otra variable, puede hacerlo de la siguiente manera:
Usted almacena el nombre de la variable a la que desea acceder, por ejemplo, var2 en este caso. Luego accedes a él con
${!<varable name>}
donde<variable name>
hay una variable que contiene el nombre de la variable a la que deseas acceder.fuente
eval var=\$$holder
peroeval
es peligroso!¿Es eso lo que estás intentando?
fuente
Lo que obtengo de su código y su salida deseada (corríjame si me equivoco):
No se usan los nombres de variable "PRIMERO" / "SEGUNDO" / ..., solo necesita un bucle con un índice ... .
Esto hará el trabajo:
for i in {1..5} ; do echo $i"q;d" ; done
fuente
SUM=$(($6 + $i)); echo $SUM"q;d"
, Veo lo que estaba haciendo mal.