【问题标题】:exit with error message in bash (oneline)在 bash 中退出并显示错误消息(单行)
【发布时间】:2014-08-27 04:21:20
【问题描述】:

是否可以在出现错误时退出并显示消息,无需使用 if 语句?

[[ $TRESHOLD =~ ^[0-9]+$ ]] || exit ERRCODE "Threshold must be an integer value!"

|| 的右侧当然不起作用,只是为了让您更好地了解我要完成的工作。

实际上,我什至不介意它会退出哪个 ERR 代码,只是为了显示消息。

编辑

我知道这会起作用,但是如何抑制 numeric arg required 显示 在我的自定义消息之后?

[[ $TRESHOLD =~ ^[0-9]+$ ]] || exit "Threshold must be an integer value!"

【问题讨论】:

    标签: bash message exit


    【解决方案1】:

    你可以使用辅助函数:

    function fail {
        printf '%s\n' "$1" >&2 ## Send message to stderr.
        exit "${2-1}" ## Return a code specified by $2, or 1 by default.
    }
    
    [[ $TRESHOLD =~ ^[0-9]+$ ]] || fail "Threshold must be an integer value!"
    

    函数名可以不同。

    【讨论】:

    • 你的意思是如果我说error_exit "msg" CODE?我喜欢你的辅助功能:)
    【解决方案2】:

    直接使用exit 可能会很棘手,因为脚本可能来自其他地方。我更喜欢使用带有set -e 的子shell(加上错误应该进入cerr,而不是cout):

    set -e
    [[ $TRESHOLD =~ ^[0-9]+$ ]] || \
         (>&2 echo "Threshold must be an integer value!"; exit $ERRCODE)
    

    【讨论】:

      【解决方案3】:

      exit 不接受多个参数。要打印任何你想要的消息,你可以使用echo然后退出。

          [[ $TRESHOLD =~ ^[0-9]+$ ]] || \
           { echo "Threshold must be an integer value!"; exit $ERRCODE; }
      

      【讨论】:

      • 你能解释一下它是从哪里发送消息numeric argument required,以及为什么我不能用2>/dev/null 禁用它吗?
      • TRESHOLD 可能为空。 echo 转到标准输出。所以重定向 2 将不起作用。您可以打印到标准错误:[[ $TRESHOLD =~ ^[0-9]+$ ]] || { echo 1>&2 "Threshold must be an integer value!"; exit $ERRCODE; }
      • 不为空,因为不提供时,设置了默认值。我提到了我的例子|| exit "message",没有使用echo
      • exit 只接受一个选项 integer(退出代码)。所以传递像"message" 这样的字符串是行不通的。
      • 哦,是的。我很愚蠢,我很困惑,因为打印我的自定义消息是那个错误的副作用。
      猜你喜欢
      • 2017-10-19
      • 1970-01-01
      • 2021-03-21
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多