Bash fügt zusätzliche einfache Anführungszeichen hinzu

12

Ich habe ein Problem beim Ausführen meines Skripts.
Wenn ich es im Debug-Modus (bash -x) ausführe, sehe ich, dass bash zusätzliche Anführungszeichen hinzufügt. Daher schlägt mein Skript fehl.

Hier ist dies in meinem Skript:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

Dies ist die Ausgabe:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
user2452585
quelle

Antworten:

7

Bash zeigt einfache Anführungszeichen an, um einen Befehl mit gültiger Eingabesyntax anzuzeigen. Es wird kein Befehl ausgeführt, der diese einfachen Anführungszeichen in einem Parameter des sshBefehls enthält.

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

Ihnen sagt, dass die letzten vier Parameter des ssh - Befehl sind "sudo, /home/pi/shared/blink.sh, 27und off".

Auf dem Remote-Host fügt der ssh-Daemon die Wörter der Befehle mit Leerzeichen als Trennzeichen zusammen, sodass der von Ihnen ausgeführte Remote-Befehl lautet

"sudo /home/pi/shared/blink.sh 27 off"

Damit wird versucht, einen Befehl auszuführen, dessen Name sudo /home/pi/shared/blink.sh 27 offnatürlich nicht existiert.

Entfernen Sie die doppelten Anführungszeichen aus Ihrer Definition von testvar.

Hier spielt es keine Rolle, aber in Ihrem konkreten Fall spielt es wahrscheinlich eine Rolle: ${testvar}Schreiben Sie stattdessen "$testvar"(oder "${testvar}"wenn Sie möchten, aber die geschweiften Klammern sind optional). Setzen Sie Variablenersetzungen immer in doppelte Anführungszeichen, es sei denn, Sie wissen, warum Sie sie weglassen müssen. "$testvar"Wird auf den Wert der Variablen erweitert testvar, während der Wert von $testvarnicht in doppelten Anführungszeichen testvarals durch Leerzeichen getrennte Liste von Glob-Mustern behandelt wird.

Gilles 'SO - hör auf böse zu sein'
quelle
3

Ich denke, dass Sie verwenden sollten:

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

Das funktioniert bei mir:

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

Aber wenn ich das Gleiche schreibe wie Sie, erhalte ich das gleiche falsche Ergebnis:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"
Radu Rădeanu
quelle
Die Anführungszeichen sind von entscheidender Bedeutung, da sie den Mechanismus der Shell darstellen, um mehrere Wörter zu einem einzigen Argument zusammenzufassen.
Glenn Jackman
2

Shell teilt den Wert der Variablen in Wörter auf. Doppelte Anführungszeichen, um das Teilen zu verhindern. Sieh den Unterschied:

t='"a b c"'
set -xv
echo $t
echo "$t"
Choroba
quelle