2010-10-13 18 views
7

J'ai un problème pour faire fonctionner mon shellscript en utilisant des guillemets. Voici une version exemple du script que j'ai un problème avec:Problème avec les guillemets dans 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 sortie de ce script est:

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

Pourquoi la première backtick en utilisant une variable pour la commande ne procèdent à des exécutions la commande complète, mais seulement renvoie la sortie de la première commande avec la deuxième commande? Il me manque quelque chose pour que le premier backtick exécute la commande?

+3

sont horriblement contre-apostrophes pas à jour et ne doivent pas être utilisés plus - en utilisant '$()' au contraire, vous permettra d'économiser beaucoup maux de tête – Daenyth

+4

S'il vous plaît voir [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050) (ne pas mettre des commandes dans les variables) et [BashFAQ/048] (http://mywiki.wooledge.org/ BashFAQ/048) (évitez d'utiliser 'eval'). Aussi, votre shebang dit "#!/Bin/sh" et votre invite dit "sh", mais votre balise de question dit '[bash]' ce qui n'est pas la même chose. –

+0

Je n'ai pas défini la balise bash, un autre utilisateur a changé cela après l'avoir posté. – benw

Répondre

10

Vous devez utiliser eval pour le faire fonctionner

result=`eval ${ECHO_CMD}`; 

à la place de

result=`${ECHO_CMD}`; 

Sans eval

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

qui sera étendu à

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

sera traitée comme argument à echo et sera sortie verbatim. Avec eval cette ligne sera réellement exécuter.

0

Dans votre premier exemple, echo analyse les paramètres - le shell ne les voit jamais. Dans le second exemple, cela fonctionne parce que le shell fait l'analyse et sait quoi faire avec un tuyau. Si vous remplacez ECHO_CMD par "bash echo ..." cela fonctionnera.

0

Bash échappe à votre commande pour vous. Essayez

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; 

Ou mieux encore, essayez de mettre -x sur la première ligne, de sorte que vous voyez ce que bash est en train de faire

2

Vous Salut,

vous devez savoir eval commande.

Voir:

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

Jetez un oeil à la doc:

help eval