2016-12-01 5 views
3

Ich brauche folgenden Befehl auf mehreren Servern auszuführen:Warum Bash-Skript bricht, wenn es in diesem Beispiel Raum trifft?

mysql -h 127.0.0.1 -uroot -psecret mydatabase -e 'SELECT 1;' 

Also, ich habe test1.sh Skript, das dynamische Zeichenfolge es echo-:

#!/bin/bash 
echo -n "mysql -h 127.0.0.1 -uroot -psecret mydatabase -e 'SELECT 1'" 

Und test2.sh Skript, die die angegebene Zeichenfolge ausführt:

Wenn ich `./test2.sh ausführen, sehe ich Hilfe Ausgabe, Befehl wird nicht ausgeführt.

Wenn ich Leerzeichen in mysql Abfrage SELECT 1 oder den gesamten -e Parameter entfernen, und dann ./test2.sh Skript ausführen, funktioniert alles.

Warum das passiert? Kannst du bitte diese Magie beschreiben?

Meine Bash-Version ist 4.2.46.

+1

Legen Befehle nicht in Variablen, die Verwendung Arrays. Der Grund ist auch nicht funktioniert, ist Zitat-Erweiterung vor Variable auftritt, so erhalten Sie zwei Argumente an mysql 'SELECT' und' 1'' anstelle von eins übergeben. – 123

+0

@ 123 Also, ich sollte Array dann drucken? Könnten Sie bitte ein Beispiel geben? – avasin

+1

Gibt es einen Grund, warum Sie zwei Skripte verwenden? – 123

Antwort

2

Solange Sie steuern und Linie Vertrauen Befehl kommt von test1.sh, Sie können gefürchtet eval in test2.sh wie folgt verwenden:

#!/bin/bash 
cmd="$(./test1.sh)" 
eval "$cmd" 

Why and when should eval use be avoided in shell scripts?

+0

Ich würde immer noch interessiert sein, was ist der Fehler mit OP-Lösung – timgeb

+2

@timgeb Ich erklärte es in den Kommentaren unten die Frage – 123

+0

Danke @ 123, ja, das ist der Grund, warum ein Befehl mit * Befehlsersatz * nicht bauen Arbeit in diesem Fall. – anubhava

-2

Können Sie versuchen test1.sh Skript wie dieses

#!/bin/bash 
echo -e "mysql -h 127.0.0.1 -uroot -psecret mydatabase -e" 

test2.sh

#!/bin/bash 
CMD=$(./test1.sh) 
${CMD} "SELECT 1" 
+0

nicht verwenden, 'SELECT ...' ist eine dynamische Zeichenfolge. – avasin

Verwandte Themen