In der Befehlszeilen-Bash-Sprache haben wir das Verhalten von mehrzeiligen, einzeiligen, Arrays und doppelten Anführungszeichen als Argumente verglichen.
Lassen Sie uns den rm-Befehl als Beispiel ausprobieren.
$ \ls -1
1.txt
2.txt
3.txt
$ rm "$( \ls -1 )"
rm: cannot remove '1.txt'$'\n''2.txt'$'\n''3.txt': No such file or directory
$ rm $( \ls -1 )
$ rm $( \ls -1 | ruby -e "puts STDIN.read.gsub(/\n/, \"\s\")" )
$ rm ( $( \ls -1 ) )
bash: syntax error near unexpected token `$( \ls -1 )'
Häufige Fehler, Irrtümer und korrekte Beispiele
Hier ist eine Zusammenfassung häufiger Fehler und korrekter Beispiele.
rm "$$( \ls -1 )"
rm "1.txt 2.txt 3.txt"
Mit rm 1.txt 2.txt 3.txt wären alle Dateien gelöscht worden.
Dies ist ein häufiger Fehler. Wenn es in doppelte Anführungszeichen eingeschlossen ist, wird es als einzelnes Argument behandelt.
rm $$( \ls -1 )
rm 1.txt 2.txt 3.txt
Das zweite ist ein typisches korrektes Beispiel. Der Schlüsselpunkt ist, es nicht in doppelte Anführungszeichen einzuschließen.
rm $$( \ls -1 | ruby -e "puts STDIN.read.gsub(/\n/, \"\s\")" )
rm $$( printf "\n1.txt\n2.txt\n3.txt\n" )
rm 1.txt 2.txt 3.txt
Das dritte ersetzt mehrzeilige Ausgabe in eine einzeilige. Die übergebenen Argumente können entweder mehrzeilig oder einzeilig sein, was bedeutet, dass sie durch Leerzeichen oder Zeilenumbrüche getrennt werden können. In jedem Fall wird es jedoch, wenn Sie die Argumente in doppelte Anführungszeichen einschließen, als einzelnes Argument behandelt und führt zu einem Fehler.
rm ( $$( \ls -1 ) )
rm (1.txt 2.txt 3.txt)
Das vierte versuchte, ein Array zu übergeben. Arrays sind kein Verarbeitungsziel, daher führt es zu einem Fehler. Da es gelegentlich Fälle gibt, in denen Sie ein Array als Argument zur Verarbeitung übergeben, können Sie es in solchen Fällen mit Klammern ohne doppelte Anführungszeichen tun.