如何使用bash

时间:2017-04-09 10:01:19

标签: bash

假设有一个命令genpairs,它生成以空字符结尾的字符串。

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:[]

e.g。读取有点不会将$'\0'分成两个变量。

想要的输出:

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

如何将以空值终止的输入读入多个变量?

编辑OP的问题 - 添加了一个更好的演示 - x y z

我可以解决它:

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]

但它看起来对我来说真的很糟糕......

1 个答案:

答案 0 :(得分:5)

只需使用两个while IFS= read -r -d '' key && IFS= read -r -d '' val; do echo "key:[$key] val:[$val]" done < <(genpairs) 语句:

mapfile

使用Bash≥4.4,您还可以将-dwhile mapfile -n 2 -d '' ary && ((${#ary[@]}>=2)); do echo "key:[${ary[0]}] val:[${ary[1]}]" done < <(genpairs) 开关一起使用:

{{1}}