2017-04-09 44 views
4

假設有一個命令genpairs,它會生成以空字符結尾的字符串。如何使用bash讀取以空對結尾的字符串成對

key1 \0 val1 \0 key2 \0 val2 \0 

想要將上述輸入成對讀入bash變量。對我來說,以下不工作:

genpairs() { #for the demo 
    printf "%d\0x\0" 1 
    printf "%d\0y\0" 2 
    printf "%d\0z\0" 3 
} 
#the above generates 1 \0 x \0 2 \0 y \0 3 \0 z \0 etc... 
while IFS= read -r -d '' key val; do 
     echo "key:[$key] val:[$val]" 
done < <(genpairs) 

打印

key:[1] val:[] 
key:[x] val:[] 
key:[2] val:[] 
key:[y] val:[] 
key:[3] val:[] 
key:[z] val:[] 

例如讀數有些不會在$'\0'上分成兩個變量。

的通緝輸出:

key:[1] val:[x] 
key:[2] val:[y] 
key:[3] val:[z] 

如何讀取空值終止輸入多個變量?

編輯的任擇議定書的問題 - 增加了一個更好的演示 - XYZ

我能解決它:

n=0 
while IFS= read -r -d '' inp; do 
     if ((n % 2)) 
     then 
       val="$inp" 
       echo "key:[$key] val:[$val]" 
     else 
       key="$inp" 
     fi 
     let n++ 
done < <(genpairs) 

這將輸出

key:[1] val:[x] 
key:[2] val:[y] 
key:[3] val:[z] 

,但它看起來對我來說真的很可怕解決方案...

回答

5

只需使用兩個read sta tements:

while IFS= read -r -d '' key && IFS= read -r -d '' val; do 
    echo "key:[$key] val:[$val]" 
done < <(genpairs) 

使用Bash≥4.4,你也可以使用mapfile-d開關:

while mapfile -n 2 -d '' ary && ((${#ary[@]}>=2)); do 
    echo "key:[${ary[0]}] val:[${ary[1]}]" 
done < <(genpairs) 
+1

爲什麼需要問這樣簡單的解決方案... :(感覺愚蠢的。非常感謝!!! – cajwine

相關問題