Wie kann ich ein Bash-Array mit mehrzeiliger Befehlsausgabe füllen?Wie befülle ich ein Bash-Array mit mehrzeiliger Befehlsausgabe?
Zum Beispiel gegeben diese printf Befehl:
$ printf 'a\nb\n\nc\n\nd\ne\nf\n\n'
a
b
c
d
e
f
Ich möchte ein Bash-Array gefüllt haben, als ob ich schrieb:
$ arr[0]='a
b'
$ arr[1]='c'
$ arr[2]='d
e
f'
und so konnte Schleife durch sie wie:
$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a
b>
<c>
<d
e
f>
Ich habe verschiedene Inkarnationen der Verwendung eines NUL-Zeichens ausprobiert, um meine beabsichtigten Array-Felder zu trennen eine leere Zeile wie das scheint wie meine beste Wette aber kein Glück so weit, z.B .:
$ IFS=$'\0' declare -a arr="($(printf 'a\nb\n\0c\n\0d\ne\nf\n\0'))"
$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a>
<b>
<c>
<d>
<e>
<f>
Ich habe auch versucht mapfile -d $'\0'
aber meine mapfile nicht -d
unterstützt.
Ich fand, dass dies funktioniert:
$ declare -a arr="($(printf '"a\nb" "c" "d\ne\nf"'))"
$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done
<a
b>
<c>
<d
e
f>
aber das scheint ein wenig klobig und ich würde "
s zu entkommen, wenn alles, was ich will es wirklich um die Schale sagen etwas anderes Zeichen als ein zu verwenden, leer als Array-Feldtrennzeichen.
FYI, 'mapfile' in' Bash' 4.4 unterstützt '-d' und wurde heute veröffentlicht. – chepner