首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash -当使用双方括号和单方括号时

Bash -当使用双方括号和单方括号时
EN

Stack Overflow用户
提问于 2014-06-02 05:52:03
回答 3查看 2.4K关注 0票数 1

请遵循以下示例(请注意字符串为null)

获得误差

代码语言:javascript
复制
 [root@linux /tmp]# STRING=
 [root@linux /tmp]#  [ $STRING = dog ] && echo "yes its a dog"
 bash: [: =: unary operator expected

语法无错误

代码语言:javascript
复制
 [root@linux /tmp]# STRING=
 [root@linux /tmp]# [[ $STRING = dog ]] && echo "yes its a dog"
 [root@linux /tmp]# [[ $STRING != dog ]] && echo "yes its a dog"
 yes its a dog

为什么当我使用单个方括号时,我会得到-一元操作符期望的

但是在双方括号的情况下,语法给出了很好的结果

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-02 06:02:51

[[ ]]不同的是,与普通命令一样,单个方括号受分词的影响。将它类似地看作是将参数传递给test内置。[[ ]]是特殊的,它中的变量不与IFS分离。这就是为什么最好使用[[ ]],因为它更高效、更安全。

这只是你不能用[做的事情之一。有了[,你就会和{ }( )一起玩,让它正常工作。请注意,( )调用一个子subshell,而{ }最终总是需要一个分号,这是很难看的。但是,您可以使用[[ ]]安全地完成该任务。

代码语言:javascript
复制
[[ a != b && c != d && ( something || something ) ]]

顺便说一下,要解决问题,您必须将变量放在双引号中,以防止拆分:

代码语言:javascript
复制
[ "$STRING" = dog ]

对于[[,它是不需要的。

Sere分词:节点/Word-Splitting.html

Add:

看起来,$STRING实际上被跳过了,因为它是空的,而不是拆分的。同样,将其解释为正常命令的概念也将适用,而应用双引号将修复它。

票数 4
EN

Stack Overflow用户

发布于 2014-06-02 06:01:34

因为[[很特别。[需要保持伯恩壳兼容性,包括其局限性。因为[[是在bash中单独引入的一个构造,所以它可以被修正。

票数 2
EN

Stack Overflow用户

发布于 2014-06-02 06:02:00

这是很难搜索,但这是非常常见的问题。尝试在googling中搜索"bash方括号“,您将看到关于这个主题的大量讨论,主要讨论如下:

https://www.google.com/search?q=bash+square+brackets

https://serverfault.com/questions/52034/what-is-the-difference-between-double-and-single-square-brackets-in-bash

.5B.5B.29

简单的回答是总是使用[除非你知道.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23988059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档