【问题标题】:understand bash script syntax理解 bash 脚本语法
【发布时间】:2014-12-15 17:20:04
【问题描述】:

以下 bash 语法是什么意思:

function use_library {
    local name=$1
    local enabled=1
    [[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && enabled=0
    return $enabled
}

我不是特别了解[[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] 这行。是某种正则表达式还是字符串比较?

【问题讨论】:

  • 这里完全不需要enabled local。简单地将最后一行设为[[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] 将对返回值产生相同的影响。

标签: linux bash fedora20


【解决方案1】:

这是一个比较变量的技巧,如果其中一些未定义/为空,则可以防止出现奇怪的行为。

您可以使用, 或任何其他。主要是它想比较${LIBS_FROM_GIT}${name} 并防止其中一个为空的情况。

正如 cmets 中的 Etan Reisner 所指出的,[[ 没有空变量扩展问题。所以这个技巧通常在与单个[比较时使用:

这不起作用:

$ [ $d == $f ] && echo "yes"
bash: [: a: unary operator expected

但是,如果我们在两个变量周围添加一个字符串,它就可以了:

$ [ ,$d, == ,$f, ] && echo "yes"
$ 

最后,注意你可以直接使用这个:

[[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && return 0 || return 1

【讨论】:

  • [[ 没有空变量扩展问题。啊,但是空模式总是匹配的。
  • 好点,@EtanReisner。我将其包含在我的答案中,谢谢。
  • 根本不需要&& ... 位。这些都是你得到的返回值。
  • 另外,在[[ 版本中,逗号唯一保护的(据我所知)是一个空的name,使用显式测试,但 .
  • 请注意,如果任一字符串为空,逗号使其工作,但如果任一字符串包含空格,则不工作。双引号是一种更好的方法。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
相关资源
最近更新 更多