Angenommen, Sie haben eine Zeichenfolge mit Leerzeichen als Trennzeichen:
newline_separated=${space_separated// /$'\n'}
Allerdings stellen Sie wahrscheinlich die falsche Frage. (Nicht unbedingt, zum Beispiel kann dies in einem Makefile vorkommen.) Eine durch Leerzeichen getrennte Liste von Dateinamen funktioniert nicht wirklich: Was passiert, wenn einer der Dateinamen Leerzeichen enthält?
Wenn ein Programm Dateinamen als Argumente erhält, dürfen Sie diese nicht mit Leerzeichen verbinden. Verwenden Sie "$@"
, um nacheinander darauf zuzugreifen. Obwohl echo "$@"
die Argumente mit Leerzeichen dazwischen echo
gedruckt werden, ist dies auf Folgendes zurückzuführen : Die Argumente werden mit Leerzeichen als Trennzeichen gedruckt. somecommand "$@"
Übergibt die Dateinamen als separate Argumente an den Befehl. Wenn Sie die Argumente in separaten Zeilen drucken möchten, können Sie verwenden
printf '%s\n' "$@"
Wenn Sie über durch Leerzeichen getrennte Dateinamen verfügen und diese in ein Array einfügen möchten, um sie zu bearbeiten, können Sie den Wert mithilfe einer nicht in Anführungszeichen gesetzten Variablenerweiterung nach Zeichen aufteilen IFS
(Sie müssen die Platzhaltererweiterung mit deaktivieren set -f
, andernfalls glob Muster werden im Wert erweitert):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
Sie können dies in eine Funktion einkapseln, die die -f
Einstellung und den Wert von " Fertig" wiederherstellt IFS
:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …