如何灵活地计算bash中的类布尔变量?

如何灵活地计算bash中的类布尔变量?,bash,Bash,无论定义的方式如何,在bash中将变量计算为true的可移植方式是什么 假设我们将为变量使用调试名称,这将是计算逻辑: 如果未定义,则假定为false(脚本也应在set-ueo pipefail模式下运行) 如果0,则为False、False、False、no->False 如果已定义且没有上述情况,则假定为真 稍微偏离上面的规范是可以接受的,但想法是相同的,以便在用户如何定义它方面给用户一些灵活性,并避免由于“意外输入”而导致执行失败 如果有人找到了一种干净的方法来实现它,那将是额外的荣誉

无论定义的方式如何,在bash中将变量计算为true的可移植方式是什么

假设我们将为变量使用调试名称,这将是计算逻辑:

  • 如果未定义,则假定为false(脚本也应在
    set-ueo pipefail
    模式下运行)
  • 如果
    0
    ,则为False、False、False、no->False
  • 如果已定义且没有上述情况,则假定为真
稍微偏离上面的规范是可以接受的,但想法是相同的,以便在用户如何定义它方面给用户一些灵活性,并避免由于“意外输入”而导致执行失败


如果有人找到了一种干净的方法来实现它,那将是额外的荣誉。

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

DEBUG="${DEBUG:-0}"
然后,在代码中选中:

if [ "${DEBUG}" -ne 0 ] ; then
    echo "DEBUG: foo ..."
fi

进一步阅读:

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

DEBUG="${DEBUG:-0}"
然后,在代码中选中:

if [ "${DEBUG}" -ne 0 ] ; then
    echo "DEBUG: foo ..."
fi

进一步阅读:

虽然我不建议对允许的值过于灵活,但我会使用
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

虽然我不建议对允许的值过于灵活,但我会使用
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

为什么我觉得如果用户定义
DEBUG=true
,这将无法工作?这不会,但我不建议尝试在shell中实现如此灵活。只需将该值设置为0或1即可。未定义的默认值0是可以的。另一种方法是使用
case
语句显式匹配您心目中的任何有效值。@chepner我正要提出这个建议,但我认为这只是无缘无故地增加了复杂性。我的意思是,在
0
上使用
False
有什么好处,或者反之亦然。为什么我觉得如果用户定义
DEBUG=true
,这将无法工作?这不会,但我不建议尝试在shell中保持如此灵活。只需将该值设置为0或1即可。未定义的默认值0是可以的。另一种方法是使用
case
语句显式匹配您心目中的任何有效值。@chepner我正要提出这个建议,但我认为这只是无缘无故地增加了复杂性。我的意思是,使用
False
而不是
0
有什么好处?反之亦然。通常,你的任何帖子都值得投一票。在这种情况下不要容忍我。我只是认为这种灵活性并没有增加真正的价值,只有潜在的缺陷。我也不喜欢这种灵活性。但是,我的目标是显式接受一组值(true或false),并拒绝任何其他值,而不是将未识别的值“默认”为true或false。我建议将
DEBUG
限制为0或1,并允许将未设置值或空值处理为0。通常,您的任何帖子都值得向上投票。在这种情况下不要容忍我。我只是认为这种灵活性并没有增加真正的价值,只有潜在的缺陷。我也不喜欢这种灵活性。但是,我的目标是显式接受一组值(true或false),并拒绝任何其他值,而不是将未识别的值“默认”为true或false。我建议将
DEBUG
限制为0或1,并允许将未设置值或空值处理为0。