
Aquí está mi pequeño fragmento de script de bash.
i=5
command='echo $i'
$command
Quiero que este script se imprima 5
, es decir, quiero que ejecute echo e imprima 5. Pero en su lugar sigue imprimiendo $i
. Entonces, ¿cómo hago para solucionar esto?
Respuesta1
Eso sería:
eval "$command"
Si desea que el contenido de $command
se evalúe como código shell.
Si no puede garantizar que $command
no comenzará con -
(lo que provocaría que eval
en algunos shells bash
se lo trate como una opción), es posible que desee ejecutar:
eval " $command"
en cambio. Ese espacio inicial adicional no afectará la forma en que se analiza el comando y evitará $command
que se trate como una opción eval
si comienza con -
. eval -- "$command"
También funcionaría en algunos shells (incluido bash
), pero no es POSIX (IIRC) y no funcionaría en dash
el shell Bourne, por ejemplo.
Tenga en cuenta que $command
probablemente debería ser:
command='echo "$i"'
A menos que tuviera la intención $i
de estar sujeto a split+glob
Una forma potencialmente mejor de almacenar código en "variables" sería utilizar funciones:
mycommand() { echo "$i"; }
(usando mycommand
en lugar de command
, como command
ya es un comando existente).
Si $command
es break
// continue
, return
el comportamiento variará según el shell.
Si quisieras $command
almacenar uncomando simple, que es una lista de palabras, la primera de las cuales se busca como el comando para ejecutar con la lista de palabras como argumentos, usarías una variable de matriz:
command=('echo' '$i' "$i")
"${command[@]}"
Eso se ejecutaría echo
, con echo
y $i
el contenido de $i
como argumentos.
command='echo $i ;x /* '$i
$command
(con el valor predeterminado de $IFS
) es el que tendría menos sentido. Allí, $command
contendría una cadena. La primera $i
se dejó como está, la segunda se expandió (como fuera de las comillas simples), y luego esa cadena estaría sujeta a split+glob (como $command
no está entre comillas dobles), cuyo resultado daría como resultado una cantidad de palabras, tomadas como uncomando simplede nuevo.