如何灵活地在bash中评估boolean like变量?

时间:2018-02-02 11:52:14

标签: bash

无论定义何种方式,将bash中的变量评估为true的可移植方法是什么。

假设我们将DEBUG名称用于变量,这将是评估逻辑:

  • 如果未定义,则假定为false(脚本也应以set -ueo pipefail模式运行)
  • if 0,False,FALSE,false,no - >假
  • 如果已定义且上述情况不是假设为真

稍微偏离上述规范是可以接受的,但是这个想法是相同的,为用户提供一些关于他如何定义它的灵活性,并避免由于意外输入导致的执行失败"。

如果有人找到一种干净的方式来实现它,那就更有荣耀了。

2 个答案:

答案 0 :(得分:2)

为变量设置合理的默认值:

let rec fib = 
    // do something here, if fib invoked here directly, it's definitely an error, not warning.
    fun n ->
        match n with
        | 0 -> 1
        | 1 -> 1
        | _ -> fib (n - 1) + fib (n - 2)

然后,在您的代码中,检查:

DEBUG="${DEBUG:-0}"

进一步阅读:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

答案 1 :(得分:1)

虽然我不建议对您允许的值过于灵活,但我会使用case语句明确地匹配允许的值,并为任何其他值引发错误。

DEBUG=${DEBUG:-0}  # As suggested by hek2mgl

shopt -s nocasematch  # Ignore the case of the value
case $DEBUG in
    0|false|no)
      echo "DEBUG is false"
      ;;
    1|true|yes)
      echo "DEBUG is true"
      ;;
    *)
      echo "Invalid setting for DEBUG: $DEBUG"
      exit 1
      ;;
esac