8 Stimmen

Wie kann ich ein Bash-Array als Eingabe für einen Befehl verwenden?

Sagen wir zum Beispiel, ich habe das folgende Array:

files=( "foo" "bar" "baz fizzle" )

Ich möchte den Inhalt dieses Arrays durch einen Befehl leiten, sagen wir sort, als ob jedes Element eine Zeile in einer Datei wäre. Sicher, ich könnte das Array in eine temporäre Datei schreiben und dann die temporäre Datei als Eingabe für sort verwenden, aber ich würde gerne vermeiden, eine temporäre Datei zu verwenden, wenn möglich.

Wenn "bar fizzle" nicht dieses Leerzeichen hätte, könnte ich etwas wie folgt tun:

echo ${files[@]} | tr ' ' '\012' | sort

Irgendwelche Ideen? Danke!

9voto

Ignacio Vazquez-Abrams Punkte 735200
sort <(for f in "${files[@]}" ; do echo "$f" ; done)

6voto

Gordon Davisson Punkte 105638

Noch eine Lösung:

printf "%s\n" "${files[@]}" | sort

3voto

Tomasz Elendt Punkte 1435
SAVE_IFS=$IFS
IFS=$'\n'
echo "${files[*]}" | sort
IFS=$SAVE_IFS

Natürlich funktioniert es nicht richtig, wenn es Zeilenumbrüche in den Array-Werten gibt.

2voto

kurt Punkte 21

Zur Sortierung von Dateien würde ich empfehlen, im Null-Terminierungsmodus zu sortieren (um Fehler bei eingebetteten Zeilenumbrüchen in Dateinamen oder Pfaden zu vermeiden):

files=(
$'fileNameWithEmbeddedNewline\n.txt'
$'saneFileName.txt'
)

echo ${#files[@]}

sort <(for f in "${files[@]}" ; do printf '%s\n' "$((i+=1)): $f" ; done)
sort -z <(for f in "${files[@]}" ; do printf '%s\000' "$((i+=1)): $f" ; done) | tr '\0' '\n'

printf "%s\000" "${files[@]}" | sort -z | tr '\0' '\n'
find . -type f -print0 | sort -z | tr '\0' '\n'

sort -z liest und schreibt nullterminierte Zeilen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X