繁体   English   中英

使用 IFS$'\\n' 将 -r jq 读入多个变量

[英]Use IFS$'\n' to read -r jq into multiple variables

我目前有以下代码可以按我的意愿工作。

foo='
[{
    "name": "e2e (control-plane, true, true, true, ipv4, IPv4, true, false)",
    "failed_step": {
        "name": "Run Tests",
        "conclusion": "failure",
        "number": 11
    }
}, {
    "name": "e2e (control-plane, true, true, true, ipv4, IPv4, true, false)",
    "failed_step": {
        "name": "Generate Test Report",
        "conclusion": "failure",
        "number": 13
    }
}]'

echo "$foo" | jq -r '.[] | .name, .failed_step.name, .failed_step.number' | while \
    read -r job && read -r step && read -r number; do
        echo "job = $job";
        echo "step = $step";
        echo "number = $number";
done

它输出以下所需的输出:

job = e2e (control-plane, true, true, true, ipv4, IPv4, true, false)
step = Run Tests
number = 11
job = e2e (control-plane, true, true, true, ipv4, IPv4, true, false)
step = Generate Test Report
number = 13

但是,我的问题是,有没有办法使用 IFS 来避免 3 个单独的读取语句? 我想出了以下内容,但是,它生成的输出不太正确。 看起来它只读入第一个变量。

echo "$foo" | jq -r '.[] | .name, .failed_step.name, .failed_step.number' | while IFS=$'\n' \
    read -r job step number; do 
        echo "job = $job";
        echo "step = $step"; 
        echo "number = $number"; 
done

输出:

job = e2e (control-plane, true, true, true, ipv4, IPv4, true, false)
step = 
number = 
job = Run Tests
step = 
number = 
job = 11
step = 
number = 
job = e2e (control-plane, true, true, true, ipv4, IPv4, true, false)
step = 
number = 
job = Generate Test Report
step = 
number = 
job = 13
step = 
number = 

我觉得必须有一种方法可以做到这一点,但是我已经研究了一段时间但没有成功。

您不需要while循环。 只需使用 jq 命令格式化它:

echo "$foo" | jq -j '.[] | "job = ", .name, "\nstep = ", .failed_step.name, "\nnumber = ", .failed_step.number, "\n"'

这会产生您想要的相同输出:

$ echo "$foo" | jq -j '.[] | "job = ", .name, "\nstep = ", .failed_step.name, "\nnumber = ", .failed_step.number, "\n"'
job = e2e (control-plane, true, true, true, ipv4, IPv4, true, false)
step = Run Tests
number = 11
job = e2e (control-plane, true, true, true, ipv4, IPv4, true, false)
step = Generate Test Report
number = 13
$

与其尝试使用\\n ,不如调整jq以使用制表符分隔。 就像是:

jq -r '.[] | .name + "\t" + .failed_step.name + "\t" + (.failed_step.number | tostring)'

然后你可以做while IFS=$'\\t' read job step number; do ... while IFS=$'\\t' read job step number; do ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM