2010-10-13 10 views
7

Tengo un problema para que mi shellscript funcione usando los palos de atrás. Aquí está una versión ejemplo de la secuencia de comandos que estoy teniendo un problema con:Problema con los palos de atrás en shellscript

#!/bin/sh 

ECHO_TEXT="Echo this" 
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'" 

result=`${ECHO_CMD}`; 
echo $result; 

result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`; 
echo $result; 

La salida de este script es:

sh-3.2$ ./test.sh 
Echo this | awk -F' ' '{print $1}' 
Echo 

¿Por qué la primera comilla invertida utilizando una variable para el comando no ejecuta realmente el comando completo pero solo devuelve la salida del primer comando junto con el segundo comando? Me falta algo para obtener el primer backtick para ejecutar el comando?

+3

acentos abiertos son terriblemente anticuados y no se deben usar más - el uso de '$()' en lugar le ahorrará muchos dolores de cabeza – Daenyth

+4

Consulte [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050) (no coloque comandos en las variables) y [BashFAQ/048] (http://mywiki.wooledge.org/ BashFAQ/048) (evite usar 'eval'). Además, tu shebang dice "#!/Bin/sh" y tu mensaje dice "sh", pero tu pregunta dice '[bash]' que no es lo mismo. –

+0

No configuré la etiqueta bash, otro usuario cambió eso después de publicar esto. – benw

Respuesta

10

Es necesario utilizar eval para que funcione

result=`eval ${ECHO_CMD}`; 

en lugar de

result=`${ECHO_CMD}`; 

Sin eval

${ECHO_TEXT} | awk -F' ' '{print \$1} 

que se ampliará a

Echo this | awk -F' ' '{print \$1} 

se tratarán como argumentos en echo y se mostrarán textualmente. Con eval esa línea realmente será ejecutar.

0

En su primer ejemplo, echo está analizando los parámetros, el intérprete de comandos nunca los ve. En el segundo ejemplo, funciona porque el shell realiza el análisis y sabe qué hacer con un conducto. Si cambia ECHO_CMD para que sea "bash echo ...", funcionará.

0

Bash está escapando de su comando para usted. Trate de

ECHO_TEXT="Echo this" 
ECHO_CMD='echo ${ECHO_TEXT} | awk -F" " "'"{print \$1}"'"' 

result=`${ECHO_CMD}`; 
echo $result; 

result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`; 
echo $result; 

O mejor aún, trate set -x en la primera línea, por lo que ver lo que está haciendo fiesta

2

Usted Hola,

lo que necesita saber eval comando.

Ver:

#!/bin/sh 

ECHO_TEXT="Echo this" 
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'" 

result="`eval ${ECHO_CMD}`" 
echo "$result" 

result="`echo ${ECHO_TEXT} | awk -F' ' '{print $1}'`" 
echo "$result" 

echar un vistazo para el doc:

help eval 
Cuestiones relacionadas