我查看了bash手册页,而[[
表示它使用了条件表达式。然后我查看了条件表达式部分,它列出了与test
(和[
)相同的运算符。
所以我想知道,Bash中[
和[[
之间有什么区别?
答案 0 :(得分:434)
[[
是bash对[
命令的改进。如果您编写以bash为目标的脚本,它有几个增强功能,使其成为更好的选择。我最喜欢的是:
它是shell的一个语法特性,因此它有一些[
没有的特殊行为。您不再需要引用像mad这样的变量,因为[[
更直观地处理空字符串和带有空格的字符串。例如,使用[
,您必须编写
if [ -f "$file" ]
正确处理空字符串或带有空格的文件名。使用[[
引号是不必要的:
if [[ -f $file ]]
因为它是一个语法功能,它允许您使用&&
和||
运算符进行布尔测试,使用<
和>
进行字符串比较。 [
无法执行此操作,因为它是常规命令,&&
,||
,<
和>
不会作为命令行参数传递给常规命令
它有一个很棒的=~
运算符用于执行正则表达式匹配。使用[
,您可以编写
if [ "$answer" = y -o "$answer" = yes ]
使用[[
,您可以将其写为
if [[ $answer =~ ^y(es)?$ ]]
它甚至允许您访问它在BASH_REMATCH
中存储的捕获组。例如,如果您在上面输入完整的“是”,则${BASH_REMATCH[1]}
将为“es”。
你可以免费获得模式匹配。也许你对如何键入yes不太严格。如果用户键入y-anything,也许你没问题。你知道了吗:
if [[ $ANSWER = y* ]]
请记住,它是一个bash扩展,所以如果你正在编写sh兼容的脚本,那么你需要坚持使用[
。如果使用双括号,请确保脚本具有#!/bin/bash
shebang行。
答案 1 :(得分:24)
[
与test
内置版相同,其作用类似于test
二进制文件(man test)
[
大致相同&&
和||
运算符进行的多项测试必须放在单独的括号中。 !
来使用shell的工具来反转命令返回值。==
和!=
是文字字符串比较[[
是一个重击
==
和!=
应用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 ...