2016-09-17 6 views
0

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.

+1

FYI, 'mapfile' in' Bash' 4.4 unterstützt '-d' und wurde heute veröffentlicht. – chepner

Antwort

5

Ein Best-Practice-Ansatz, mit NUL Begrenzungszeichen:

arr=() 
while IFS= read -r -d '' item; do 
    arr+=("$item") 
done < <(printf 'a\nb\n\0c\n\0d\ne\nf\n\0') 

..., die noch einfacher mit bash 4.4 wäre:

mapfile -t -d '' arr < <(printf 'a\nb\n\0c\n\0d\ne\nf\n\0') 

viel gröber, die Doppel Newline Separator unterstützt Ansatz:

item='' 
array=() 
while IFS= read -r line; do 
    if [[ $line ]]; then 
    if [[ $item ]]; then 
     item+=$'\n'"$line" 
    else 
     item="$line" 
    fi 
    else 
    [[ $item ]] && { 
     array+=("$item") 
     item='' 
    } 
    fi 
done < <(printf 'a\nb\n\nc\n\nd\ne\nf\n\n') 
Verwandte Themen