[和[[在Bash中有什么区别?

我看了bash的手册页,说[[使用条件expression式。 然后我查看了条件expression式部分,它列出了和test (和[ )一样的运算符。

所以我想知道, [[[在Bash中有什么区别?

[[是bash对[命令]的改进。 如果您编写以bash为目标的脚本,它有几个增强function,使它成为更好的select。 我的最爱是:

  1. 它是shell的一个语法特征,所以它有一些特殊的行为[没有。 你不必再像疯了一样引用variables,因为[[更直观地处理空白string和空白string。 例如,用[你必须写

     if [ -f "$file" ] 

    正确处理空string或文件名与空格在其中。 与[[报价是不必要的:

     if [[ -f $file ]] 
  2. 因为它是一个语法function,所以可以使用&&|| 用于布尔testing的运算符和用于string比较的<>[不能这样做,因为它是一个常规命令和&&||<>不作为命令行parameter passing给常规命令。

  3. 它有一个精彩的=~运算符来进行正则expression式匹配。 用[你可能会写

     if [ "$answer" = y -o "$answer" = yes ] 

    随着[[你可以写这个

     if [[ $answer =~ ^y(es)?$ ]] 

    它甚至可以让你访问它存储在BASH_REMATCH的捕获组。 例如,如果您在上面input完整的“是”,则${BASH_REMATCH[1]}将是“es”。

  4. 你可以免费获得模式匹配又名globbing。 也许你对如何inputyes不太严格。 也许你没事,如果用户input任何东西。 你有覆盖:

     if [[ $ANSWER = y* ]] 

请记住,这是一个bash扩展,所以如果你正在写sh兼容的脚本,那么你需要坚持[ 。 如果使用双括号,请确保您的脚本具有#!/bin/bash shebang行。

也可以看看

  • Bash常见问题解答 – “testing和[[?
  • 打击做法 – 打击testing
  • 服务器故障 – bash中的双括号和单括号之间的区别是什么?
  • [与内置test相同,并且像test二进制文件(man test)一样工作
    • 在许多类UNIX环境中与其他基于sh的shell相同
    • 只支持单一的条件。 用bash &&||多重testing 运营商必须在单独的括号内。
    • 本身不支持“不”操作符。 要反转一个条件,请使用! 在第一个括号之外使用shell的工具来反转命令返回值。
    • ==!=是文字string比较
  • [[是一个bash
    • 是bash特定的,尽pipe其他shell可能已经实现了类似的构造。 不要指望它在一个老派的UNIX sh。
    • ==!=应用bash模式匹配规则,请参阅man bash “模式匹配”
    • 有一个=~正则expression式匹配运算符
    • 允许使用括号和!&&|| 在括号内的逻辑运算符合并子expression式

除此之外,它们非常相似 – 大多数单独的testing在它们之间的工作是相同的,当需要将不同的testing与逻辑AND / OR / NOT操作组合时,事情才会变得有趣。

在bash中,与[[[防止variables值的字分割相反]

最重要的区别将是代码的清晰度 。 是的,是的,上面说的是真实的,但[[]]使你的代码符合你所期望的高级语言,特别是关于AND( && ),OR( || )和NOT( )运营商。 因此,当你在系统和语言之间移动时,你将能够更快地解释脚本,这使得你的生活更轻松。 从一个很好的UNIX / Linux参考中获得基本信息。 在某些情况下,你可能会发现一些有用的东西,但是你会永远感激清晰的代码! 你宁愿阅读哪个脚本片段? 即使是脱离语境,第一select更容易阅读和理解。


 if [[ -d $newDir && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep '/$') ]] then ... 

要么

 if [ -d "$newDir" -a -n $(echo "$newDir" | grep "^${webRootParent}") -a -n $(echo "$newDir" | grep '/$') ] then ...