2010-10-13 13 views
7

Sto riscontrando un problema nel far funzionare il mio shell script con i backtick. Ecco una versione ad esempio dello script sto avendo un problema con:Problema con i backtick in 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; 

L'output di questo script è:

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

Perché il primo apice inverso utilizzando una variabile per il comando in realtà non esegue il comando completo ma restituisce solo l'output del primo comando insieme al secondo comando? Mi manca qualcosa per ottenere il primo backtick per eseguire il comando?

+3

backtick sono terribilmente obsolete e non devono essere utilizzati più - con '$()' invece vi farà risparmiare molti mal di testa – Daenyth

+4

Si prega di vedere [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050) (non inserire comandi nelle variabili) e [BashFAQ/048] (http://mywiki.wooledge.org/ BashFAQ/048) (evita di usare 'eval'). Inoltre, il tuo shebang dice "#!/Bin/sh" e il tuo prompt dice "sh", ma il tuo tag di domanda dice '[bash]' che non è la stessa cosa. –

+0

Non ho impostato il tag bash, un altro utente l'ha modificato dopo averlo postato. – benw

risposta

10

è necessario utilizzare eval per farlo funzionare

result=`eval ${ECHO_CMD}`; 

al posto di

result=`${ECHO_CMD}`; 

Senza eval

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

che sarà ampliato per

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

verranno trattati come argomento a echo e verranno restituiti alla lettera. Con eval tale linea sarà in realtà eseguita.

0

Nel tuo primo esempio echo sta analizzando i parametri - la shell non li vede mai. Nel secondo esempio funziona perché la shell sta eseguendo l'analisi e sa cosa fare con una pipe. Se cambi ECHO_CMD in "bash echo ..." funzionerà.

0

Bash sta sfuggendo al tuo comando per te. Provare

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, meglio ancora, provare a impostare -x sulla prima riga, in modo da vedere che cosa sta facendo bash

2

È Ciao,

è necessario conoscere comando eval.

Vedi:

#!/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" 

Date un'occhiata al doc:

help eval