我正在尝试创建一个
err
函数供 bash 脚本使用。该函数应该模拟 BSD 的 errx(3)
——打印指定的消息并使用指定为第一个参数的代码退出:
function err {
# set +u
# The first argument must be an integer exit-code:
if ! declare -i code=${1:?err called with no arguments}
then
code=70 # Use EX_SOFTWARE by default
fi
shift
if [ -t 2 ]
then
# Use color -- red -- printing final errors to a terminal:
printf "%s: \e[1;31m%s\e[1;0m\n" ${0##*/} "$*" >&2
else
printf "%s: %s\n" ${0##*/} "$*" >&2
fi
set -x
exit $code
}
当正确调用时,它会按预期工作,例如
err 1 Date is empty
。但是,当不带参数调用或第一个参数不是数字时,会报告 declare
行中的错误,但未处理:根据是否设置 -u
,脚本要么立即终止declare
行,或 code
初始化为 0,脚本以此退出 - 而不是 70。
我做错了什么?
您的脚本在非交互式 shell 中执行,因此以下内容适用(来自 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html):
${parameter:?word} 如果参数为 null 或未设置,则展开 写入单词(如果单词不存在,则写入一条消息) 到标准错误和外壳,如果它不是交互式的,则退出....
注意最后的“退出”。
declare
在这种情况下不会被调用,因为参数替换首先发生并导致 shell 退出。