Soy relativamente nuevo en el script de shell, pero casi he completado un script que hace uso del programa lftp . La parte del script con la que tengo problemas es cuando creo una larga cadena de comandos (separados por ;
).
for var in something
do
...
commands_to_run+="echo Result is `tail -n 1 $somefile`;"
done
Lo que estoy notando es que el tail
programa, envuelto en los backticks, se está ejecutando cuando el ciclo for está iterando, pero no cuando invoco la cadena de comandos más adelante en mi script.
Desafortunadamente, el contenido de $ somefile no está en esta etapa listo para ser inspeccionado. ¿Cómo puedo ejecutar el comando cuando lo necesito, y no mientras estoy creando la cadena?
fuente
$(...)
como sugirió Hauke, pero la barra diagonal inversa es la clave.eval
que puede hacer lo mismo al no escapar de las$
comillas simples ('
) en lugar de las comillas dobles ("
) para rodear su comando.echo
una cadena con contenido que incluye la salida de un comando anidado de ejecución demorada.echo
no va a funcionar porque no hay un comando para hacerloeval
, sino más bien una cadena. Si tiene un ejemplo más pertinente para nosotros, podemos intentar ayudarlo.Hay varios niveles de citas. Las comillas dobles (
"..."
) espacios en blanco proteger y varios caracteres especiales (~
,&
,|
,;
, ...) pero no impide la expansión de parámetros y la sustitución de comandos.Necesita comillas simples (
'
) o una barra diagonal inversa delante de los caracteres "peligrosos".En general: debe considerar usar en
$(tail ...)
lugar de backticks. Los backticks son el estándar más antiguo, pero estamos hablando de tan antiguo que$()
no causa problemas a la mayoría de las personas. La nueva versión es más fácil de leer y puede anidarse. Y mucho menos los problemas de formato aquí en sx ...fuente
$(...)
aún produce el mismo resultado: el shell ejecuta esto cuando se define mi cadena.$()
pero necesita las comillas simples de todos modos.