假设有一个命令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]
但它看起来对我来说真的很糟糕......
答案 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,您还可以将-d
与while mapfile -n 2 -d '' ary && ((${#ary[@]}>=2)); do
echo "key:[${ary[0]}] val:[${ary[1]}]"
done < <(genpairs)
开关一起使用:
{{1}}