Problem mit backticks in shellscript
Ich habe ein problem, mein shellscript arbeitet mit backticks. Hier ist ein Beispiel-version des Skripts ich habe ein Problem mit:
#!/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;
Die Ausgabe dieses Skripts ist:
sh-3.2$ ./test.sh
Echo this | awk -F' ' '{print $1}'
Echo
Warum tut das erste backtick die Verwendung einer Variablen für den Befehl nicht tatsächlich ausführen der vollständige Befehl, sondern gibt nur die Ausgabe des ersten Befehls zusammen mit dem zweiten Befehl? Bin ich etwas fehlt, um die ersten "backtick", um den Befehl auszuführen?
- Backticks sind schrecklich veraltet und sollten nicht mehr benutzt werden -- mit
$()
stattdessen wird sparen Sie viele Kopfschmerzen - Bitte siehe BashFAQ/050 (don ' T put-Befehle in Variablen) und BashFAQ/048 (vermeiden Sie die Verwendung
eval
). Auch deine shebang sagt "#!/bin/sh" und Ihr prompt sagt "sh", aber Ihre Frage-tag sagt[bash]
die nicht die gleiche Sache. - Ich habe nicht den bash-tag, einem anderen Benutzer geändert, nachdem ich dies gepostet.
- POSIX-sh unterstützt
$()
. Es gibt keine Entschuldigung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
eval
um es arbeitenstatt
Ohne
eval
wird erweitert werden, um
werden so behandelt, als argument zu
echo
- und Ausgabe von verbatim. Miteval
dieser Linie tatsächlich laufen.Sie Hi,
müssen Sie wissen eval Befehl.
Finden Sie unter :
Nehmen Sie einen Blick an den doc :
In deinem ersten Beispiel ist echo das Parsen der Parameter der shell sieht Sie nie. In dem zweiten Beispiel funktioniert es, weil die shell ist dabei die Analyse und weiß, was zu tun ist mit einem Rohr. Wenn Sie ändern ECHO_CMD zu "bash echo ..." wird es funktionieren.
Bash entkommen ist Ihren Befehl für Sie. Versuchen
Oder noch besser, versuchen Sie set-x in der ersten Zeile, so dass Sie sehen, was die bash tut