我正在尝试验证rpms,在while循环中分配一些变量,并在循环内进行更多处理。
while read fstatus fname rc
do
echo "RC : ${lrc}"
done < <(rpm --verify apache2 | awk -vrc=$? '{printf "%s %s %s", $1, $NF, rc}')
循环中有几件事,只有当我的返回代码不是 0 时,我才想做(所以只有当 rpm 验证失败时)。我不知道如何获取 rpm --验证循环内的返回代码。$? 或 PIPESTATUS 赋值不起作用。我想我的问题是,管道之后的命令(在我的例子中是awk)是否会知道管道之前的命令的返回代码(rpm --在这种情况下验证)。
试试这个:
rpm --verify apache2 > tempfile && awk -vrc=$? '{printf "%s %s %s", $1, $NF, rc}' tempfile
这样,只有当 rpm --verify 成功时,才会执行 awk。如果失败,awk 将不会运行,您将在 $?? 中获得它的状态。
像这样的事情怎么样(将 RC 的值作为字符串传递):
while read fstatus fname rc
do
echo "RC : ${lrc}"
done < <( { v=$(rpm --verify apache2); printf "%sn" "$v $?" ;} | awk '{printf "%s %s %sn", $1, $(NF-1), $NF}')
请注意,awk printf 中的n
是正确馈送读取循环所必需的。
---编辑----了解到RC需要打印在每一行上。也许这样更合适:
done < <( v=$(rpm --verify apache2) ; awk -v rc=$? '{printf "%s %s %sn", $1, $NF, rc}' <<< "$v" )
--刚刚看到了另一个解决方案。我想唯一的区别是写入文件或变量。