[和[[在Bash中有什么区别?
我看着bash手册页, [[它说使用条件表达式。 然后我查看了条件表达式部分,它列出了与test (和[ )相同的运算符。
所以我想知道, [和[[在Bash中有什么区别?
[[是bash对[命令]的改进。 如果您编写以bash为目标的脚本,它具有多项增强功能,因此是更好的选择。 我的最爱是:
它是shell的语法特征,所以它有一些[没有的特殊行为。 你不再需要像疯了一样引用变量,因为[[更直观地处理空白字符串和空白字符串。 例如, [你必须写
if [ -f "$file" ]
正确处理空字符串或其中包含空格的文件名。 与[[报价是不必要的:
if [[ -f $file ]]
由于它是一种语法功能,因此可以使用&&和|| 用于布尔测试的运算符和用于字符串比较的<和> 。 [不能这样做,因为它是一个常规命令, && , || , <和>不作为命令行参数传递给常规命令。
它有一个美妙的=~运算符来进行正则表达式匹配。 用[你可能会写
if [ "$answer" = y -o "$answer" = yes ]
随着[[你可以写成这样
if [[ $answer =~ ^y(es)?$ ]]
它甚至可以让你访问存储在BASH_REMATCH的捕获组。 例如,如果您在上面输入完整的“是”,则${BASH_REMATCH[1]}将是“es”。
你可以免费获得模式匹配又名globbing。 也许你对如何输入yes不太严格。 如果用户输入任何东西,也许你没事。 你有覆盖:
if [[ $ANSWER = y* ]]
请记住,这是一个bash扩展名,所以如果你正在编写sh兼容的脚本,那么你需要坚持[ 。 如果您使用双括号,请确保您的脚本具有#!/bin/bash shebang行。
也可以看看
[与内置test相同,并且像test二进制文件(man test)一样工作 [在许多类UNIX环境中的所有其他基于sh的shell中一样 &&和||多重测试 操作员必须在单独的括号内。 ! 在第一个支架之外使用shell的工具来反转命令返回值。 ==和!=是文字字符串比较 [[是一个bash ==和!=应用bash模式匹配规则,请参阅man bash “模式匹配” =~正则表达式匹配运算符 ! , &&和|| 括号内的逻辑运算符合并子表达式 除此之外,它们非常相似 - 大多数单独的测试在它们之间以相同的方式工作,当需要将不同的测试与逻辑AND / OR / NOT操作组合时,事情才会变得有趣。
在bash中,与[ , [[防止变量值的字分割相反。
