【问题标题】:Trouble setting variable in a bash script在 bash 脚本中设置变量时遇到问题
【发布时间】:2014-02-25 20:49:36
【问题描述】:

我在使用一个非常简单的 bash 脚本 (test.sh) 时遇到了问题:

if [ $# >=1 ]
then
  backup_file=$1
else
  backup_file=~/standard.tar.bz2
fi

echo $backup_file

如果我传递一个参数:

test.sh myfile

我得到了预期的输出:myfile

否则,我没有输出。我期待看到(当 test.sh 在没有参数的情况下执行时):~/standard.tar.bz2

我做错了什么?

【问题讨论】:

  • 随意利用tag wiki 上列出的资源,例如shellcheck,它会自动诊断此类问题。

标签: bash


【解决方案1】:

这个条件评估就是问题所在:

[ $# >=1 ]

将其更改为:

[ $# -ge 1 ]

否则在 BASH 中:

[[ $# -ge 1 ]]

或者:

(( $# ))
  • [...][[...]] 不允许 >= 作为运算符
  • 运算符后面需要一个空格。

【讨论】:

  • (( $# )),或[ -n "$1" ]。最后一个略有不同,但在某些情况下可能更有价值。
【解决方案2】:

如果您使用数学运算符,请在正确的上下文中使用它。而不是说:

if [ $# >=1 ]

if (( $# >=1 ))

(而且您不必担心运算符周围的空格或缺少空格。)

【讨论】:

    【解决方案3】:

    其他人已经解决了直接的句法问题,但编写此问题的完全不同的方法是利用parameter expansion to use a default value

    backup_file="${1:-$HOME/standard.tar.bz2}"
    

    当且仅当它存在时,这将用 $1 中的值替换 backup_file。

    【讨论】:

    • 您仍然可以使用~ 而不是$HOME 作为默认值。
    • @chepner 对,但我实际上更喜欢脚本中的 HOME,因为 ~ 做了一些其他可能不受欢迎的扩展(即使它们不太可能偶然发生)。各有各的。 (stackoverflow.com/questions/5930671/…)
    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多