"[]" 和 "[[]]" 之间有什么不同?
"[]"和"[[]]"之间的区别是什么?
问题的出现的原因是代码的清晰度。使用"[[ ]]"可以使代码更加符合高级语言的语法规范,特别是在AND(&&)、OR(||)和NOT(!)操作符方面。因此,当你在不同的系统和语言之间切换时,你能更快地解释脚本,从而更容易地进行开发。你可以从UNIX/Linux参考资料中了解更多细节。在某些情况下,你可能会发现其中一些细节对你有用,但你始终会更欣赏清晰的代码。你更愿意阅读哪个脚本片段?即使在没有上下文的情况下,第一个选择也更容易阅读和理解。
解决方法是使用"[[ ]]"而不是"[]"来编写代码。
尽管其他答案在技术上是正确的,但这是唯一完全正确的答案。
"代码的清晰度是最重要的区别。":不,区别在于"["是一个命令,而"[[ ]]"是一个语法元素("保留字")。因此,解析方式不同。
不是吗?我只是在谈论实际的区别。如果我没记错的话,"[[ ]]"是"let"的简写。归根结底,对于一般人来说,阅读和可维护性更重要。这就是为什么我说"最重要",而不是"唯一"或"按照规范"的区别。
它是"(( ))"类似于"let"。但这是用于算术计算,不仅仅是布尔逻辑。
我喜欢使用"(( ))"来进行算术计算。
"[]"和"[[]]"之间的区别是什么?
"[]"是与内置的"test"命令相同,与"test"二进制文件一样工作(参见man test)。在许多类UNIX环境中的其他基于sh的shell中,它的工作方式与"["相同。它仅支持单个条件。使用bash的"&&"和"||"运算符进行多个测试必须在单独的括号中。它不支持原生的'not'运算符。要反转条件,可以在第一个括号外使用"!"来使用shell的反转命令返回值的功能。"=="和"!="是字面字符串比较。
"[[["是bash的特殊语法,虽然其他shell可能实现了类似的结构,在老式UNIX sh中不会有这个功能。"=="和"!="应用bash的模式匹配规则,请参阅"man bash"中的"Pattern Matching"。它具有"=~"正则表达式匹配运算符。它允许在括号内使用括号和"!"、"&&"和"||"逻辑运算符来组合子表达式。
除此之外,它们非常相似-大多数单独的测试在它们之间的工作方式完全相同,只有在需要使用逻辑AND/OR/NOT操作来组合不同的测试时才变得有趣。
test支持使用-a和-o进行多个条件,并且具有not运算符,例如:if [ ! -z x ]; then echo Y; fi。
一个次要的观点是,[["来自ksh。许多bash的"扩展"只是ksh的功能。
原因:该问题的出现是因为用户对"[]"和"[[]]"之间的区别感到困惑。用户希望了解它们之间的差异,以便正确地使用它们。
解决方法:通过提供有关"[]"和"[[]]"的详细信息来解决这个问题。解释了它们之间的区别和用法。同时还提供了一些额外的说明,以帮助用户更好地理解它们。
中括号[ ]
和双中括号[[ ]]
之间的区别是,双中括号[[ ]]
是bash的改进版本,对于编写针对bash的脚本来说,它具有一些改进的功能。以下是一些我最喜欢的功能:
- 双中括号
[[ ]]
是shell的语法特性,因此它具有一些[ ]
没有的特殊行为。不必像疯狂引用变量一样,因为[[ ]]
更直观地处理空字符串和带有空格的字符串。例如,使用[ ]
,您必须编写if [ -f "$file" ]
来正确处理空字符串或带有空格的文件名。而使用
[[ ]]
,引号是不必要的:if [[ -f $file ]]
- 因为双中括号
[[ ]]
是一种语法特性,它允许您使用&&
和||
运算符进行布尔测试,使用<
和>
进行字符串比较。[ ]
无法做到这一点,因为它是一个普通的命令,&&
、||
、<
和>
不作为命令行参数传递给普通命令。 - 它具有一个很棒的
=~
操作符,用于进行正则表达式匹配。使用[ ]
,您可能会写成if [ "$answer" = y -o "$answer" = yes ]
而使用
[[ ]]
,您可以这样写:if [[ $answer =~ ^y(es)?$ ]]
它甚至允许您访问存储在
BASH_REMATCH
中的捕获组。例如,如果您在上面输入了完整的"yes",那么${BASH_REMATCH[1]}
将是"es"。 - 它免费提供了模式匹配功能。也许您对如何输入"yes"不那么严格。也许您允许用户输入以"y"开头的任何内容。这也没问题:
if [[ $ANSWER = y* ]]
请记住,双中括号[[ ]]
是bash的扩展,因此如果您编写的是兼容sh的脚本,则需要使用[ ]
。如果您使用双中括号,请确保脚本中有#!/bin/bash
的shebang行。
参考资料
- Bash FAQ - "What is the difference between test, [ and [[ ?"
- Bash Practices - Bash Tests
- Server Fault - What is the difference between double and single brackets in bash?
值得注意的是,双中括号[[ ]]
也存在于ksh和最近的POSIX sh规范中。关于可以在[ ]
或[[ ]]
内部使用的条件表达式(如-f
、-z
等)的参考文档,可以参考Bash参考手册:Bash条件表达式。
我在特定的服务器上使用的是Ubuntu,我的sh(实际上是dash版本0.5.8)不支持[[ ]]
。
在pubs.opengroup.org上存在,但是行为没有指定,因此在需要符合POSIX的情况下不能依赖它。