【问题标题】:How does this line from a Bash Script work?Bash 脚本中的这一行是如何工作的?
【发布时间】:2016-03-05 06:20:01
【问题描述】:

我试图弄清楚BASH man page tab completion script 顶部的某行代码是如何工作的:

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

我相信这是一个守卫;如果 BASH 特殊变量 $OSTYPE 不包含括号内的(基本正则?)表达式中的字符串之一,或者如果用户空间是 GNU,那么它将停止执行脚本。但是,我无法理解语法的工作原理或含义,也不知道控制流是什么。

你可以找到_userlandhere的定义:

# 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 ]]
}

这个功能是如何工作的?它是否返回一个值?

如果您能提供相关文档或文章的参考资料,那将很有帮助。谢谢。

【问题讨论】:

    标签: bash syntax


    【解决方案1】:

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

    所以在这个命令链中:

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

    如果OSTYPE 是darwin、freebsd 等之一,则链停止。您可以在man bash 中阅读更多关于那里使用的模式,搜索Pattern Matching。在本例中,适用的规则是:

    @(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 ]] :将值与我们收到的参数进行比较。此比较的退出代码是函数的返回值。如果值匹配,则表示成功。

    【讨论】:

    • 感谢您为我分解它!
    • 为了完整起见:在我的 Mac OS 上,当我运行 echo $OSTYPE 时,我得到了输出 darwin15。并且 bash 手册页的 Pattern Matching 部分说明如果设置了 extglob shopt 选项(在 bash_completion 脚本中,与定义 _userland 的相同),然后*(pattern-list) “[m] 匹配零个或多个给定模式的出现”,其中“模式列表是由 | 分隔的一个或多个模式的列表”。这对我来说似乎是一个完整的解决方案!
    • 嗯,实际上我不太了解模式匹配,我没有得到尾随 * (这只是“匹配任何字符串,包括空字符串”吗?目的?)或者为什么他们不使用+ 来在开放括号之前。我认为这意味着它必须在列表中包含其中一种模式。
    • 我添加了有关该模式的更多解释,请参阅我更新的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多