2017-09-12 2 views
0

Also versuche ich, dieses seltsame Verhalten herauszufinden.Ausführen von Linux-Befehlen in Anführungszeichen

$ hello hello   
-ksh: hello: not found [No such file or directory] 
$ "hello hello" 
-ksh: hello hello: not found [No such file or directory] 
$ echo hello hello 
hello hello 
$ `echo hello hello` 
-ksh: hello: not found [No such file or directory] 
$ echo \"hello hello\" 
"hello hello" 
$ `echo \"hello hello\"` 
-ksh: "hello: not found [No such file or directory] 

Die 2. und 6. Befehle sind die relevantesten für meine Frage. Wenn ich diesen zweiten Befehl "hello hello" ausführen, wird es das als ein großes Argument auswerten. Wenn ich jedoch versuche, den letzten Befehl auszuführen

`echo \"hello hello\"` 

dann sollte es das gleiche Verhalten haben? Aber es sieht "hello als sein eigenes unabhängiges Wort. Können einige das erklären und wie kann ich diesen 6. Befehl wie den 2. Befehl arbeiten lassen, so dass er "Hallo Hallo" als eine ganze Aussage auswertet?

(Dies hat eine praktischere Anwendung, aber das war das kleinste Beispiel, das ich produzieren könnte).

Vielen Dank im Voraus!

EDIT: Ich sehe, ich habe einen Downvote, also werde ich konkreter sein, auf welches Problem ich stoße.

rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done 

Beachten Sie, dass rcli4 ist nur ein Alias ​​für redis-cli -p. Ich bekomme immer eine

(error) ERR wrong number of arguments for 'get' command 

, die aufgrund der Anführungszeichen falsch analysiert wird. Ich habe verschiedene Kombinationen von Dingen ausprobiert, wie das Hinzufügen von mehr Anführungszeichen, das Entfernen dieser sed-Anweisung usw., aber ich denke, dass ich mein Problem lösen kann.

+0

'ksh' ist nicht' bash', müssen Sie möglicherweise Ihre Tags oder Ihre Shell reparieren –

+1

Innerhalb einer Zeichenfolge in Anführungszeichen ist ein Zitat nur ein anderes Zeichen. Es hat keine besondere Kraft. – John1024

+0

@EricRenouf Whoops!Danke, –

Antwort

1

Innerhalb einer Zeichenfolge in Anführungszeichen ist ein Anführungszeichen nur ein anderes Zeichen. Es hat keine besondere Kraft.

Wenn ich das Problem richtig verstehe, wie es in der Bearbeitung angegeben ist, ist die Lösung zu $lineinnerhalb der die Do-Schleife, nicht davor. So versucht:

rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done 

Ohne die doppelten Anführungszeichen um $line würde die Schale Wort Spaltung und Pfadname Expansion auf dem Inhalt line auszuführen. Du willst auch nicht. Doppelte Anführungszeichen unterdrückt beides.

Außerdem haben wir die Option -r zu read hinzugefügt. Dies verhindert read Backslash-Verarbeitung für den Inhalt von line.

Zum Schluss setzen wir einfache Anführungszeichen um den Datenbankschlüssel glob AAA*. Ohne Anführungszeichen interpretiert die Shell AAA* als Datei-Glob und führt Pfadname-Erweiterung darauf aus. Wenn sich im aktuellen Verzeichnis Dateien befinden, die diesem Glob entsprechen, sind die Ergebnisse unerwartet und unerwünscht. Wenn die bash-Option nullglob gesetzt ist, ist das Ergebnis nicht das, was Sie wollen, unabhängig davon, welche Dateien sich im aktuellen Verzeichnis befinden.

Verwandte Themen