【问题标题】:How to read null terminated strings in pairs using bash如何使用 bash 成对读取以空字符结尾的字符串
【发布时间】:2017-04-09 10:01:18
【问题描述】:

比方说,有一个命令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:[]

例如读取在$'\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]

但它在我看来真的很糟糕的解决方案......

【问题讨论】:

    标签: bash


    【解决方案1】:

    只需使用两个read 语句:

    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)
    

    【讨论】:

    • 为什么我需要这样简单的解决方案... :( 感觉很愚蠢。非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多