[和[[在Bash?之间]有什么区别?

时间:2010-08-06 21:18:21

标签: bash

我查看了bash手册页,而[[表示它使用了条件表达式。然后我查看了条件表达式部分,它列出了与test(和[)相同的运算符。

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

4 个答案:

答案 0 :(得分:434)

[[是bash对[命令的改进。如果您编写以bash为目标的脚本,它有几个增强功能,使其成为更好的选择。我最喜欢的是:

  1. 它是shell的一个语法特性,因此它有一些[没有的特殊行为。您不再需要引用像mad这样的变量,因为[[更直观地处理空字符串和带有空格的字符串。例如,使用[,您必须编写

    if [ -f "$file" ]
    

    正确处理空字符串或带有空格的文件名。使用[[引号是不必要的:

    if [[ -f $file ]]
    
  2. 因为它是一个语法功能,它允许您使用&&||运算符进行布尔测试,使用<>进行字符串比较。 [无法执行此操作,因为它是常规命令,&&||<>不会作为命令行参数传递给常规命令

  3. 它有一个很棒的=~运算符用于执行正则表达式匹配。使用[,您可以编写

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

    使用[[,您可以将其写为

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

    它甚至允许您访问它在BASH_REMATCH中存储的捕获组。例如,如果您在上面输入完整的“是”,则${BASH_REMATCH[1]}将为“es”。

  4. 你可以免费获得模式匹配。也许你对如何键入yes不太严格。如果用户键入y-anything,也许你没问题。你知道了吗:

    if [[ $ANSWER = y* ]]
    
  5. 请记住,它是一个bash扩展,所以如果你正在编写sh兼容的脚本,那么你需要坚持使用[。如果使用双括号,请确保脚本具有#!/bin/bash shebang行。

    另见

答案 1 :(得分:24)

  • [test内置版相同,其作用类似于test二进制文件(man test)
      在许多类UNIX环境中,
    • 与所有其他基于sh的shell中的[大致相同
    • 仅支持单一条件。使用bash &&||运算符进行的多项测试必须放在单独的括号中。
    • 本身不支持'not'运算符。要反转条件,请使用第一个括号外的!来使用shell的工具来反转命令返回值。
    • ==!=是文字字符串比较
  • [[是一个重击
    • 是特定于bash的,尽管其他shell可能已经实现了类似的构造。不要指望它在老式的UNIX sh。
    • ==!=应用bash模式匹配规则,请参阅man bash
    • 中的“模式匹配”
    • 有一个=~正则表达式匹配运算符
    • 允许使用括号和括号内的!&&||逻辑运算符来组合子表达式

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

答案 2 :(得分:7)

在bash中,与[相反,[[会阻止变量值的分词。

答案 3 :(得分:6)

最重要的区别是代码的清晰度。是的,是的,上面说的是真的,但 [[]] 使您的代码符合您对高级语言的期望,特别是在AND(&amp;&amp; ),OR( || )和NOT()运算符。因此,当您在系统和语言之间移动时,您将能够更快地解释脚本,从而使您的生活更轻松。从一个好的UNIX / Linux参考中获取细节。您可能会发现某些细节在某些情况下很有用,但您将始终欣赏 clear 代码!您更喜欢阅读哪个脚本片段?即使脱离背景,第一选择也更容易阅读和理解。


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 ...