Ich habe ein sehr einfaches Skript zur Befehlssubstitution geschrieben, das unten aufgeführt ist:
#!/bin/bash files=$(ls *.fastq); echo $files
Das Verzeichnis enthält eine Reihe von .fastq-Dateien, und ich möchte nur den Befehl echo verwenden, um sie auszugeben.
Das obige sript gibt fastq-Dateien mit einem Leerzeichen zwischen den einzelnen fastq-Dateinamen aus.
Wenn ich es auf diese Weise verwende
#!/bin/bash files=$(ls *.fastq); echo "$files"
werden die Ergebnisse in neuen Zeilen gedruckt.
Warum ist das so? Hat dies etwas mit der Ersetzung von Befehlen zu tun?
Danke
Antwort
Wenn Sie auf eine Variable verweisen, wird diese verwendet Im Allgemeinen ist es ratsam, den Namen in doppelte Anführungszeichen zu setzen. Dies verhindert eine Neuinterpretation aller Sonderzeichen innerhalb der Zeichenfolge in Anführungszeichen – mit Ausnahme von $
, `
(backquote) und \
(Flucht). Wenn Sie $
als Sonderzeichen in doppelten Anführungszeichen behalten, können Sie auf eine Variable in Anführungszeichen („$ variable“) verweisen, dh die Variable durch ihren Wert ersetzen.
Verwenden doppelte Anführungszeichen, um das Aufteilen von Wörtern zu verhindern. Ein in doppelte Anführungszeichen eingeschlossenes Argument wird als einzelnes Wort dargestellt, auch wenn es Leerzeichen enthält.
z. B.
variable1="a variable containing five words" COMMAND This is $variable1 # Executes COMMAND with 7 arguments: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Executes COMMAND with 1 argument: # "This is a variable containing five words"
Das Einfügen der Argumente in eine Echoanweisung in doppelte Anführungszeichen ist nur erforderlich, wenn das Aufteilen von Wörtern oder das Beibehalten von Leerzeichen ein Problem darstellt.
Weitere Informationen und Beispiele finden Sie unter hier
Antwort
Sie haben Zeilenumbrüche, weil ls
sie in separate Zeilen setzt. Die Zeilenumbrüche verschwinden ohne Anführungszeichen, da die Shell (Bash) jeden nicht durch Leerzeichen getrennten Text als separates Argument an den Befehl übergibt.
Hinweis: Die Befehlsersetzung erfolgt durch die Shell, nicht durch ls
, sodass Sie ls
nicht benötigen.
Daher können Sie
#!/bin/bash echo *.fastq
oder
#!/bin/bash files="*.fastq" echo "$files"
Kommentare
- Ausführen von ls * .fastq auf den Terminalausgängen Wie werden die Dokumente in derselben durch Leerzeichen getrennten Zeile in separate Zeilen gesetzt?
- Ich kann die Dokumente nicht finden, aber
ls
gibt dieselbe Ausgabe wiels -x
wenn zu einem tty und wiels -1
wenn nicht. Verwenden Sie daherls -x
, um das zu erhalten, was Sie möchten.
Antwort
Wenn Sie auf eine Variable ohne Anführungszeichen verweisen (z. B. echo $files
), teilt die Shell den Wert in Leerzeichen auf und übergibt jeden Begriff als separate Befehlszeilenoption. Zeilenumbrüche werden wie alle anderen Leerzeichen behandelt. Das Programm echo
sieht die Zeilenumbruchzeichen überhaupt nicht, sondern erhält nur ein Array von Zeichenfolgen, von denen jede ein einzelner Dateiname ist.
Wenn Sie darauf verweisen Bei einer Variablen in Anführungszeichen (z. B. echo "$files"
) führt die Shell keine Leerzeichenaufteilung durch. Stattdessen wird der gesamte Wert unverändert als einzelnes Argument übergeben. Das Programm echo
empfängt eine lange Zeichenfolge, die die Zeilenumbruchzeichen enthält.
Abgesehen von Variablen ist dies das gleiche Verhalten, das Sie bei Anführungszeichen um Literalwerte erhalten. Wenn Sie echo foo bar
schreiben, werden die Leerzeichen von der Shell entfernt und echo
erhält nur die Zeichenfolgen foo
und bar
, und es werden diese Zeichenfolgen mit einem einzigen Leerzeichen dazwischen gedruckt, da dies so codiert ist, dass mehrere Argumente kombiniert werden. Wenn Sie echo "foo bar"
, echo
ruft die einzelne Zeichenfolge foo bar
ab und druckt sie unverändert.