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"'

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.


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"

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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.