Quiero crear dinámicamente una secuencia de cadenas manipulando una matriz de elementos y creando 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 por $6
es igual a .
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"
Respuesta aceptada:
En primer lugar, no puede haber ningún espacio alrededor de =
en la declaración de variables en bash
.
Para obtener lo que desea, puede usar eval
.
Por ejemplo, un script de muestra como el suyo:
#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
eval "$name"="'$(( $i + 1 ))q;d'"
printf '%sn' "${!name}"
i=$(( $i + 1 ))
done
Impresiones :
1q;d
2q;d
3q;d
4q;d
5q;d
Usa eval
con cautela, algunas personas lo llaman malvado por alguna razón válida.
declare
también funcionaría :
#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
declare "$name"="$(( $i + 1 ))q;d"
printf '%sn' "${!name}"
i=$(( $i + 1 ))
done
también imprime:
1q;d
2q;d
3q;d
4q;d
5q;d