【问题标题】:Adding default to bash script variable将默认值添加到 bash 脚本变量
【发布时间】:2015-07-02 19:06:59
【问题描述】:

我有一个使用 $1 处理命令行参数的 bash 脚本。

即使没有给出命令行参数,我也想修改此脚本以使其正常工作;在这种情况下,我希望脚本使用默认值。

我不知道该怎么做;基本上我认为我需要用我自己的变量替换$1,并在程序的开头有一行检查是否为$1 传递了一个值,如果不使用我将提供的默认值。但我不知道它的语法。谁能帮帮我?

【问题讨论】:

    标签: bash command-line-arguments


    【解决方案1】:

    使用parameter expansion:

    var=${1:-default}
    

    来自给定的链接:

    ${parameter:-word}

    如果参数未设置或为空,则替换单词的扩展。 否则,参数的值被替换。

    看一个例子:

    $ echo "$v"
    
    $ t=${v:-hello}
    $ echo "$t"
    hello
    $ v=2
    $ t=${v:-hello}
    $ echo "$t"
    2
    

    还要注意${var:-value}${var-value} 不一样:What is the difference between ${var:-word} and ${var-word}?

    【讨论】:

      【解决方案2】:

      试试:

      echo "${1:-"my default"}"
      

      在您的脚本(例如foo.sh)中查看:- 修饰符的效果。

      请注意,如果您将空字符串传递给脚本,默认值也会生效:

      $ ./foo.sh ""
      my default
      

      因此,您无法通过这种方式将空字符串与未给定的参数区分开来。

      如果您需要区分,您应该依靠$# 告诉您参数的数量:

      if [ $# = 0 ]
      then
        echo "my default"
      else
        echo "$1"
      fi
      

      =>

      $ printf "[%s]\n" "$(./foo.sh "")"
      []
      

      【讨论】:

      • 实际上,我还不知道${a-b},并认为它优于使用$#
      • @cdarke [ $# -eq 0 ]
      • @cdarke 绝对正确。在这些情况下,我更喜欢第一个,因为它的结果相同,可能更便宜,打字更少等等。但是一旦涉及到像 (( $# > 5 )) 这样的比较,数字语法可能更容易阅读。
      • @User112638726 是的,旧的 Bourne shell 语法。但是使用了=,而不是-eq
      • 我一直认为-eq-lt 等是离合器和次优解决方案。使用=>= 等有助于他们的视觉效果以防止错误,所以如果可能的话,我更喜欢它们。
      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 2021-02-21
      • 2022-01-20
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多