[和[[在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中,与[
, [[
防止变量值的字分割相反。