Problème avec backticks dans script shell
Question
J'ai un problème pour obtenir mon shellscript travailler en utilisant les backticks. Voici une version exemple du script que j'ai un problème avec:
#!/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 fait exécuter la commande complète mais seulement retourne la sortie de la première commande ainsi que la deuxième commande? Il me manque quelque chose pour obtenir le premier backtick pour exécuter la commande?
La solution
Vous devez utiliser eval
pour le faire fonctionner
result=`eval ${ECHO_CMD}`;
au lieu de
result=`${ECHO_CMD}`;
Sans eval
${ECHO_TEXT} | awk -F' ' '{print \$1}
qui sera étendue à
Echo this | awk -F' ' '{print \$1}
sera traitée comme argument pour echo
et sera sortie in extenso. Avec eval
cette ligne sera effectivement run .
Autres conseils
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
Dans votre premier écho exemple est l'analyse des paramètres - le shell ne les voit jamais. Dans le second exemple, il fonctionne parce que la coquille est en train de faire l'analyse syntaxique et sait quoi faire avec un tuyau. Si vous changez ECHO_CMD être "bash echo ..." cela va fonctionner.
Bash est votre commande échappe 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 fait