【问题标题】:Equal/minus sign without a colon in a parameter expasion in bashbash 中的参数扩展中不带冒号的等号/减号
【发布时间】:2022-06-29 06:45:31
【问题描述】:

我最近在 Bash 脚本中有这样的 sn-p:

$ echo ${A=3}

现在,我知道${A:=3} 将设置变量A 如果A 是“假”,或者${A:-3} 将返回3 如果A 是“假”。不过,我从未见过这些没有冒号的类似表达式,我在Bash's documentation 中找不到这些无冒号表达式的解释。

这是怎么回事?

【问题讨论】:

    标签: bash


    【解决方案1】:

    实际上,文档确实解释了这些表达方式,即使有点掩饰了lede:

    当不执行子字符串扩展时,使用下面描述的形式(例如,':-'),Bash 测试未设置或为空的参数。省略冒号会导致仅对未设置的参数进行测试。换句话说,如果包含冒号,则运算符会测试两个参数的存在以及它的值是否不为空;如果省略冒号,则运算符仅测试是否存在。

    实际上,这意味着如果未设置变量,它们的行为方式相同:

    $ echo ${A=no-colon}
    no-colon
    $ echo ${B:=with-colon}
    with-colon
    echo $A
    no-colon
    $ echo $B
    with-colon
    

    但是,如果将变量设置为空字符串,则行为会有所不同。带有冒号的表达式将设置变量并返回值,而没有冒号的表达式将保持变量不变(即设置为空字符串)并返回其空值:

    $ A='' ; B=''
    $ echo ${A=no-colon}
    
    $ echo ${B:=with-colon}
    with-colon
    $ echo $A
    
    $ echo $B
    with-colon
    

    如文档中所述,相同的逻辑适用于其他“运算符”(-?+)。

    本着 Can I answer my own question? 的精神发布它,因为即使在代码中找到它,我也花了很长时间才学会它。也许通过一些例子让它更明确一点,可以帮助其他人:)

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 2015-01-16
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多