2016-09-17 29 views
0

如何用多行命令輸出填充bash數組?如何使用多行命令輸出填充bash數組?

例如給這個printf命令:

$ printf 'a\nb\n\nc\n\nd\ne\nf\n\n' 
a 
b 

c 

d 
e 
f 

我想有一個bash數組填充,如果我寫道:

$ arr[0]='a 
b' 
$ arr[1]='c' 
$ arr[2]='d 
e 
f' 

等可以遍歷它:

$ for i in "${arr[@]}"; do printf "<%s>\n" "$i"; done 
<a 
b> 
<c> 
<d 
e 
f> 

我嘗試過使用NUL字符來分隔我想要的數組字段的各種化身,而不是一個空行作爲這似乎是我最好的選擇,但到目前爲止沒有運氣,例如:

$ 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> 

我也試過mapfile -d $'\0',但我的映射文件不支持-d

我也發現這個工程:

$ 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> 

,但似乎有點麻煩,我不得不逃離"■當我真正希望它告訴shell使用之外的其他一些字符作爲數組字段分隔符空白。

+1

僅供參考''mapfile' in'bash' 4.4支持'-d'並於今天發佈。 – chepner

回答

5

的最佳實踐方法,使用NUL分隔符:

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

...這甚至會使用bash 4.4簡單:

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

更加粗暴,支持雙換行分隔符方法:

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') 
相關問題