Echovariable mit Inhalt aus der Befehlssubstitution

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 wie ls -x wenn zu einem tty und wie ls -1 wenn nicht. Verwenden Sie daher ls -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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.