[英]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.