【问题标题】:How can I check if a variable that need to contain a number has been set? [duplicate]如何检查是否设置了需要包含数字的变量? [复制]
【发布时间】:2018-12-14 05:05:16
【问题描述】:

给定以下代码:

Max=
if [[ something exists.. ]]; then
     Max=2
// .. more code that can changes the value of Max
fi
// HERE

如果 Max 等于某个数字(已设置),我如何在“此处”检查?

【问题讨论】:

    标签: bash


    【解决方案1】:
    if [ -z "$Max" ]
    then
      echo "Max: not set"
    else if [ $Max -eq some_number ]
    then
      echo "Max is equal to some number"
    else
      echo "Max is set but not equal to some number"
    fi
    

    if [ -n "$Max" -a "$Max" = "some_number" ]
    ...
    

    请注意,第二个示例是进行字符串比较,它可以解决一些令人头疼的问题,但可能会伤害纯粹主义者的敏感性。

    【讨论】:

    • 请注意,-a 在 POSIX 测试标准中被标记为过时;查看pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html 中的OB 标记
    • 另外,= 是一个字符串比较器,也许你想要-eq505 不同可以吗?
    • 我找到了纯粹主义者。 :)
    • @ghoti - = 是为了防范类似Max=five 的东西。我假设some_number 被硬编码到脚本中,而不是用户输入。
    • 有时很重要——test 允许逻辑 AND、OR 和括号控制操作顺序的使用已过时,这是有充分理由的。考虑a='('b=')';是[ "$a" = "$b" ] 询问() 是否是同一个字符(假!),还是分组操作测试= 是否为非空字符串(真!)?为了便于解释,那个特殊的极端案例是一个简单的案例,但存在更糟糕的变体。 [[ ]] 没有问题——作为语法,它知道哪些词是从变量扩展而来的,哪些是表达式的一部分。
    【解决方案2】:

    酷!

    Max 默认设置为空值,当在算术上下文中使用时,返回零。例如:

    尝试运行echo $(( definitelyNotAGivenName)),结果为零,酷!

    您可以使用圆括号进行算术比较 - 查看更多 herehere

    【讨论】:

    • 我不知道您使用的是哪个 shell,但 bash 绝对不会默认 vars 为零。
    • @keithpjolley,在算术上下文中确实如此,因为空字符串(扩展未设置变量的结果)在这种上下文中被视为具有零值(当未引用时 - $(( $empty ))计算结果为 0,$(( "$empty" )) 是一个错误)。
    • 修正了你的措辞
    • 整洁!我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2021-12-08
    • 1970-01-01
    • 2021-04-09
    • 2018-06-29
    • 2017-09-03
    • 1970-01-01
    相关资源
    最近更新 更多