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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top