当前位置: 首页 > 知识库问答 >
问题:

Bash中单方括号和双方括号的区别

强化
2023-03-14

我正在阅读关于if的bash示例,但有些示例是用单方括号编写的:

if [ -f $param ]
then
  #...
fi

其他带双方括号:

if [[ $? -ne 0 ]]
then
    start looking for errors in yourlog
fi

有什么区别?

共有3个答案

晏炳
2023-03-14

用于条件试验的单支架内(即[…]),所有shell都支持一些操作符,如single,而一些旧shell不支持使用操作符。

用于条件测试的双支架内(即[…]),在旧的或新的shell中使用与使用没有区别。

编辑:我还应该注意:在bash中,始终使用双括号[[…]如果可能,因为它比单支架更安全。我将用以下示例说明原因:

if [ $var == "hello" ]; then

如果$var恰好为null/空,则脚本会看到:

if [ == "hello" ]; then

这会破坏你的剧本。解决方案是要么使用双括号,要么始终记住在变量周围加引号(“$var”)。双括号是更好的防御性编码实践。

何宏博
2023-03-14

行为差异

在Bash 4.3.11中测试:

>

  • POSIX vs Bash扩展:

    • 是POSIX

    常规命令vs魔法

    >

    只是[的最后一个参数。

    实际上,Ubuntu 16.04在coreutils提供的可执行文件中有一个可执行文件,但bash内置版本优先。

    Bash解析命令的方式没有任何改变。

    特别是,<代码>

    >

  • [[X]]是一个单一的构造,可以神奇地解析X<代码>

    还有进一步的区别,如==~

    在Bashese中:[是一个内置命令,而[[/code>是一个关键字:https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

    <代码>

    • [a

    <代码>

    • <代码>[[a=a

    • <代码>[[(a=a | | a=b)

    扩展时的分词和文件名生成(拆分glob)

    • x='a b'; [[ $x='a b']]:正确,不需要引用
    • x='a b';[$x='a b']:语法错误,扩展为[a b='a b']
    • x='*'; [ $x='a b']:如果当前目录中有多个文件,则语法错误。
    • x='a b'; [ "$x"='a b']: POSIX等效

    <代码>=

    • [[ab=a?]]: true,因为它进行模式匹配(* ? [很神奇)。不会全局扩展到当前目录中的文件。
    • [ab=a?]a?全局扩展。因此,根据当前目录中的文件,可能是真或假。
    • [ab=a\?]:假,不是全局扩展
    • ===[[[中是相同的,但==是Bash扩展。
    • (a?)回声匹配中的case ab;esac:POSIX等效
    • [[ab=~'ab?' ]]: false,在Bash 3.2及更高版本的"中失去魔力,并且未启用与bash 3.1的兼容性(如BASH_COMPAT=3.1
    • [[ab?=~'ab?' ]] : true

    <代码>=~

    • <代码>[[ab=~ ab?]] :true,POSIX扩展正则表达式匹配, 不全局展开

    建议:始终使用

    我所看到的每一个构造都有POSIX等价物。

    如果您使用

    • 失去便携性
    • 强迫读者学习另一个bash扩展的复杂性。[只是一个名字奇怪的常规命令,不涉及特殊的语义学。

    感谢Stéphane Chazelas的重要更正和补充。

  • 万高轩
    2023-03-14

    Single是符合posix shell的条件测试

    Double是标准的扩展,由bash和其他shell(例如zsh、ksh)支持。它们支持额外的操作(以及标准的posix操作)。例如:|而不是-o和与=~匹配的正则表达式。在bash手册的条件构造部分可以找到更完整的差异列表。

    只要您希望脚本可以跨shell移植,就可以使用脚本。如果希望条件表达式不受[[]]支持且不需要可移植,请使用。

     类似资料:
    • 问题内容: 我对以下代码行的语法感到困惑: 数据框对象由2列(“大脑”和“身体”)组成 当我打印x_values时,我得到这样的东西: 就dataframe对象的属性和方法而言,我知道pandas文档,但双括号语法使我感到困惑。 问题答案: 考虑一下: 来源DF: 选择一列-生成Pandas.Series: 选择DataFrame的子集-结果为DataFrame: 结论: 第二种方法允许我们从Da

    • 问题内容: 我是bash脚本的新手,使用双括号时遇到问题。我似乎无法让它们在Ubuntu Server 11.10中完全正常工作。我下面的脚本在if_test.sh中。 当我运行此简单的shell脚本时,输出为:if_test.sh:5:[[:找不到 从终端运行bash –version后,似乎正在运行GNU bash 4.2.10。任何帮助将不胜感激。谢谢! 问题答案: 问题出在脚本调用上。您正

    • 问题内容: 我对这个尖角世界是陌生的,我对使用双花括号{{}}和单花括号{}感到困惑,或者有时不使用花括号来包含指令中的表达式 问题答案: {{}}-双大括号: 是Angular表达式,当您希望将内容编写为HTML时非常方便: 不要在已经是表达式的地方使用它们! 例如,该指令将引号之间的任何内容都视为一个表达式: {}-大括号: 我们知道JavaScript代表对象。这里也没有什么不同: 使用一些

    • 这两个numpy对象有什么区别?

    • 这里我理解哈希(#)符号将定义为本地模板变量,但是前面的星号是什么意思呢?还有,有必要吗? 下面是使用括号的示例: 我有点理解周围的括号将它绑定到HTML属性/Angular指令。这是否意味着它们是Angular计算表达式的指针?就像是Angular 1中的的等价物? 我猜真正的问题是,这些符号在Angular 2中有特殊的含义吗,知道何时使用每一个的最简单的方法是什么?谢谢!!

    • 本文向大家介绍浅析python 中大括号中括号小括号的区分,包括了浅析python 中大括号中括号小括号的区分的使用技巧和注意事项,需要的朋友参考一下 python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ }。其作用也各不相同,分别用来代表不同的python基本内置数据类型。 1.python中的小括号( ):代表tuple元组数据类型,元组是一种不可变序列