¿Cómo ejecutar una cadena con valores como comando en bash?

¿Cómo ejecutar una cadena con valores como comando en bash?

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 $commandse evalúe como código shell.

Si no puede garantizar que $commandno comenzará con -(lo que provocaría que evalen algunos shells bashse 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á $commandque se trate como una opción evalsi comienza con -. eval -- "$command"También funcionaría en algunos shells (incluido bash), pero no es POSIX (IIRC) y no funcionaría en dashel shell Bourne, por ejemplo.

Tenga en cuenta que $commandprobablemente debería ser:

command='echo "$i"'

A menos que tuviera la intención $ide estar sujeto a split+glob

Una forma potencialmente mejor de almacenar código en "variables" sería utilizar funciones:

mycommand() { echo "$i"; }

(usando mycommanden lugar de command, como commandya es un comando existente).

Si $commandes break// continue, returnel comportamiento variará según el shell.

Si quisieras $commandalmacenar 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 echoy $iel contenido de $icomo argumentos.

command='echo $i ;x /* '$i
$command

(con el valor predeterminado de $IFS) es el que tendría menos sentido. Allí, $commandcontendría una cadena. La primera $ise dejó como está, la segunda se expandió (como fuera de las comillas simples), y luego esa cadena estaría sujeta a split+glob (como $commandno está entre comillas dobles), cuyo resultado daría como resultado una cantidad de palabras, tomadas como uncomando simplede nuevo.

información relacionada