Bash脚本中的这一行是如何工作的?

时间:2016-03-05 06:20:02

标签: bash syntax

我想弄清楚BASH man page tab completion script顶部的某段代码如何工作:

[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]] || _userland GNU \
    || return 1

我相信这是一个守卫;如果BASH特殊变量$OSTYPE不包含括号内包含的(基本常规?)表达式中的一个字符串,或者如果userland是GNU则它将停止执行脚本。但是,我无法理解语法是如何工作的或它意味着什么,我不知道控制流是什么。

您可以找到_userland here的定义:

# Check if we're running on the given userland
# @param $1 userland to check for
_userland()
{
    local userland=$( uname -s )
    [[ $userland == @(Linux|GNU/*) ]] && userland=GNU
    [[ $userland == $1 ]]
}

这个功能如何运作?它会返回一个值吗?

如果您可以提供相关文档或文章的参考,那将会有所帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

c1 || c2 || c3 || ...链中,将尝试每个命令直到一个成功。成功执行命令后,链中的其余命令将不会执行。

所以在这个命令链中:

[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]] \
|| _userland GNU \
|| return 1

如果OSTYPE是darwin,freebsd等之一,那么链就会停止。您可以在man bash中详细了解此处使用的模式,搜索模式匹配。在此示例中,适用的规则是:

@(pattern-list)
    Matches one of the given patterns

模式由|分隔。 *周围的@(...)表示这些模式可以出现在OSTYPE内的任何位置。只有@(...)表示与给定模式完全匹配,@(...)*意味着从任何给定模式开始,*@(...)意味着以任何给定模式结束。

如果OSTYPE没有匹配,我们会尝试链中的下一个项目:_userland GNU。如果成功,那么链条会停止。否则,我们尝试链中的下一个项目return 1,因此我们退出该函数。

_userland函数执行:

  • local userland=$( uname -s ):将uname -s命令的输出存储在名为userland
  • 的局部变量中
  • [[ $userland == @(Linux|GNU/*) ]] && userland=GNU:如果值为Linux或以GNU/开头,则设置userland=GNU
  • [[ $userland == $1 ]]:将值与我们收到的参数进行比较。此比较的退出代码是函数的返回值。如果值匹配,则表示成功。