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 $6iguales 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
evalprecaución, algunas personas lo llaman malvado por alguna razón válida.declarefuncionaría también:también imprime:
fuente
!signo de exclamaciónprintf '%s\n' "${!name}"?bashpará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).declaresolo establece la variable en el ámbito local, mientras que elevalenfoque 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=\$$holderperoevales 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" ; donefuente
SUM=$(($6 + $i)); echo $SUM"q;d", Veo lo que estaba haciendo mal.