[和[[在Bash中有什么区别?
我看了bash的手册页,说[[
使用条件expression式。 然后我查看了条件expression式部分,它列出了和test
(和[
)一样的运算符。
所以我想知道, [
和[[
在Bash中有什么区别?
[[
是bash对[
命令]的改进。 如果您编写以bash为目标的脚本,它有几个增强function,使它成为更好的select。 我的最爱是:
-
它是shell的一个语法特征,所以它有一些特殊的行为
[
没有。 你不必再像疯了一样引用variables,因为[[
更直观地处理空白string和空白string。 例如,用[
你必须写if [ -f "$file" ]
正确处理空string或文件名与空格在其中。 与
[[
报价是不必要的:if [[ -f $file ]]
-
因为它是一个语法function,所以可以使用
&&
和||
用于布尔testing的运算符和用于string比较的<
和>
。[
不能这样做,因为它是一个常规命令和&&
,||
,<
和>
不作为命令行parameter passing给常规命令。 -
它有一个精彩的
=~
运算符来进行正则expression式匹配。 用[
你可能会写if [ "$answer" = y -o "$answer" = yes ]
随着
[[
你可以写这个if [[ $answer =~ ^y(es)?$ ]]
它甚至可以让你访问它存储在
BASH_REMATCH
的捕获组。 例如,如果您在上面input完整的“是”,则${BASH_REMATCH[1]}
将是“es”。 -
你可以免费获得模式匹配又名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 ...