我有一个从某处复制的有效的 global_exit ,它用于两个命令退出。将“echo”重命名为“ech”以强制失败,使我能够测试所有排列工作 - 它们在这里执行:
echo "$USER $(date +%F)" |& tee info.log
info_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee list.log
list_exit=${PIPESTATUS[0]}
global_exit=$(( info_exit > list_exit ? info_exit : list_exit ))
if [ ${global_exit} = "0" ]; then
echo ">> SUCCESS <<"
elif [ ${global_exit} = "1" ]; then
echo ">> WARNINGS <<"
else
echo ">> FAILED <<"
fi
exit
我如何将其扩展到三个 RC?我还没有找到有关如何使用此功能的规则。我只是猜测使用下面的内容,但它不适用于同一测试的所有排列(将一个 echo 逐一重命名为 ech 以强制失败):
echo "$USER $(date +%F)" |& tee info.log
info_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee list.log
list_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee check.log
check_exit=${PIPESTATUS[0]}
global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))
if [ ${global_exit} = "0" ]; then
echo ">> SUCCESS <<"
elif [ ${global_exit} = "1" ]; then
echo ">> WARNINGS <<"
else
echo ">> FAILED <<"
fi
exit
谢谢 :)
答案1
如果我的意图是正确的,并且您希望继续使用所编写的代码,请更改以下内容:
global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))
对此:
global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit ? list_exit : check_exit )))
正如你所知道的,如果 info_exit 最大,它就可以正常工作。如果不是,则根据 list_exit > check_exit 是否将 global_exit 设置为 0 或 1。添加附加条件后,它将被设置为 list_exit 或 check_exit 中的较大者。
答案2
一起检查 0、1 和所有其他返回码的一种可能性是组合返回码:
echo "$USER $(date +%F)" |& tee info.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee list.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee check.log
exit_code=$((exit_code | PIPESTATUS[0]))
if (( 0 == exit_code )); then
echo ">> SUCCESS <<"
elif (( 1 == exit_code )); then
echo ">> WARNING <<"
else
echo ">> FAILED <<"
fi
使用这种方法,您无法区分退出代码,并且可能会出现多个返回代码,但对于一般的 OK/Not OK 返回代码来说应该足够了。
答案3
你可以使用一个函数并检查全部状态码PIPESTATUS
并保存最高值。
#!/bin/bash
max_exit=0
set_max_exit() {
for i in "${PIPESTATUS[@]}"; do
[ "$i" -gt "$max_exit" ] && max_exit=$i
done
}
echo | grep x # exit 1
set_max_exit
ech # exit 127
set_max_exit
ls adfds # exit 2
set_max_exit
if [ "$max_exit" -eq 0 ]; then
echo ">> SUCCESS <<"
elif [ "$max_exit" -eq 1 ]; then
echo ">> WARNING <<" >&2
else
echo ">> FAILED <<" >&2
fi
exit "$max_exit"
输出:
$ ./script.sh
./script.sh: line 14: ech: command not found
ls: cannot access 'adfds': No such file or directory
>> FAILED <<
$ echo $?
127