如何在 bash 中强制执行变量类型?

问题描述 投票:0回答:1

我正在尝试创建一个

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。

我做错了什么?

bash error-handling declare strong-typing
1个回答
0
投票

您的脚本在非交互式 shell 中执行,因此以下内容适用(来自 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html):

${parameter:?word} 如果参数为 null 或未设置,则展开 写入单词(如果单词不存在,则写入一条消息) 到标准错误和外壳,如果它不是交互式的,则退出....

注意最后的“退出”。

declare
在这种情况下不会被调用,因为参数替换首先发生并导致 shell 退出。

© www.soinside.com 2019 - 2024. All rights reserved.