"[]" 和 "[[]]" 之间有什么不同?

20 浏览
0 Comments

"[]" 和 "[[]]" 之间有什么不同?

我查看了Bash的man页面,发现[[使用条件表达式。然后我查看了条件表达式部分,发现它列出了与test(和[)相同的运算符。\n所以我想知道,在Bash中[[[之间有什么区别?

0
0 Comments

"[]"和"[[]]"之间的区别是什么?

问题的出现的原因是代码的清晰度。使用"[[ ]]"可以使代码更加符合高级语言的语法规范,特别是在AND(&&)、OR(||)和NOT(!)操作符方面。因此,当你在不同的系统和语言之间切换时,你能更快地解释脚本,从而更容易地进行开发。你可以从UNIX/Linux参考资料中了解更多细节。在某些情况下,你可能会发现其中一些细节对你有用,但你始终会更欣赏清晰的代码。你更愿意阅读哪个脚本片段?即使在没有上下文的情况下,第一个选择也更容易阅读和理解。

解决方法是使用"[[ ]]"而不是"[]"来编写代码。

尽管其他答案在技术上是正确的,但这是唯一完全正确的答案。

"代码的清晰度是最重要的区别。":不,区别在于"["是一个命令,而"[[ ]]"是一个语法元素("保留字")。因此,解析方式不同。

不是吗?我只是在谈论实际的区别。如果我没记错的话,"[[ ]]"是"let"的简写。归根结底,对于一般人来说,阅读和可维护性更重要。这就是为什么我说"最重要",而不是"唯一"或"按照规范"的区别。

它是"(( ))"类似于"let"。但这是用于算术计算,不仅仅是布尔逻辑。

我喜欢使用"(( ))"来进行算术计算。

0
0 Comments

"[]"和"[[]]"之间的区别是什么?

"[]"是与内置的"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的功能。

原因:该问题的出现是因为用户对"[]"和"[[]]"之间的区别感到困惑。用户希望了解它们之间的差异,以便正确地使用它们。

解决方法:通过提供有关"[]"和"[[]]"的详细信息来解决这个问题。解释了它们之间的区别和用法。同时还提供了一些额外的说明,以帮助用户更好地理解它们。

0
0 Comments

中括号[ ]和双中括号[[ ]]之间的区别是,双中括号[[ ]]是bash的改进版本,对于编写针对bash的脚本来说,它具有一些改进的功能。以下是一些我最喜欢的功能:

  1. 双中括号[[ ]]是shell的语法特性,因此它具有一些[ ]没有的特殊行为。不必像疯狂引用变量一样,因为[[ ]]更直观地处理空字符串和带有空格的字符串。例如,使用[ ],您必须编写

    if [ -f "$file" ]
    

    来正确处理空字符串或带有空格的文件名。而使用[[ ]],引号是不必要的:

    if [[ -f $file ]]
    

  2. 因为双中括号[[ ]]是一种语法特性,它允许您使用&&||运算符进行布尔测试,使用<>进行字符串比较。[ ]无法做到这一点,因为它是一个普通的命令,&&||<>不作为命令行参数传递给普通命令。
  3. 它具有一个很棒的=~操作符,用于进行正则表达式匹配。使用[ ],您可能会写成

    if [ "$answer" = y -o "$answer" = yes ]
    

    而使用[[ ]],您可以这样写:

    if [[ $answer =~ ^y(es)?$ ]]
    

    它甚至允许您访问存储在BASH_REMATCH中的捕获组。例如,如果您在上面输入了完整的"yes",那么${BASH_REMATCH[1]}将是"es"。

  4. 它免费提供了模式匹配功能。也许您对如何输入"yes"不那么严格。也许您允许用户输入以"y"开头的任何内容。这也没问题:

    if [[ $ANSWER = y* ]]
    

请记住,双中括号[[ ]]是bash的扩展,因此如果您编写的是兼容sh的脚本,则需要使用[ ]。如果您使用双中括号,请确保脚本中有#!/bin/bash的shebang行。

参考资料

值得注意的是,双中括号[[ ]]也存在于ksh和最近的POSIX sh规范中。关于可以在[ ][[ ]]内部使用的条件表达式(如-f-z等)的参考文档,可以参考Bash参考手册:Bash条件表达式

我在特定的服务器上使用的是Ubuntu,我的sh(实际上是dash版本0.5.8)不支持[[ ]]

pubs.opengroup.org上存在,但是行为没有指定,因此在需要符合POSIX的情况下不能依赖它。

0