“[ ]” vs. “[[ ]]” in Bash shell
这可能已经得到了答复,但我无论如何都要问。我有两个版本的脚本(comp.sh-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #!/bin/sh
export tDay=$(date '+%Y%m%d')
newfile="filename_$tDay"
filename="filename_20120821100002.csv"
echo $newfile $filename
if [ $filename = *$newfile* ]
then
echo"Matched"
else
echo"Not Matched!"
fi
Output:
$ ./comp.sh
filename_20120821 filename_20120821100002.csv
Not Matched! |
和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/sh
export tDay=$(date '+%Y%m%d')
newfile="filename_$tDay"
filename="filename_20120821100002.csv"
echo $newfile $filename
if [[ $filename = *$newfile* ]]
then
echo"Matched"
else
echo"Not Matched!"
fi
$ comp.sh
filename_20120821 filename_20120821100002.csv
Matched |
有人能解释一下为什么不同吗?
另外-在什么情况下,应该使用[ ]与[[ ]],反之亦然?
- 这个问题是类似的,并且有一个很好的答案,它指向伟大的文档:stackoverflow.com/questions/669452/…
[[是一个内置的bash,不能在#!/bin/sh脚本中使用。您将需要阅读bash手册的条件命令部分来学习[[的功能。突然想到的主要好处是:
- ==和!=执行模式匹配,因此右侧可以是全局模式
- =~和!~执行正则表达式匹配。捕获的组存储在BASH_REMATCH数组中。
- 布尔运算符&&和||。
- 不需要分词,所以不必严格引用变量。
主要缺点:您的脚本现在是特定于bash的。
test的字符串相等运算符不执行globs。
1 2 3 4
| $ [ abc = *bc ] ; echo $?
1
$ [[ abc = *bc ]] ; echo $?
0 |
- 我能看到。但是,为什么,你能详细说明为什么[ ]和[[ ]]会有区别吗?
- 不,我不能。很多事情大多数人都不知道,仅仅是因为带来这些事情的决策过程是不透明的。
- 好吧,那么[ ]显然是(是)一个程序test吗?
- @Annjawn:它既可以作为一个单独的程序,也可以作为一个内置的bash。
- 迷惑!那么,这是我们选择[[ ]]而不是[ ]的原因吗?
- @太平洋标准时间:来自江户十一〔6〕号:"当江户十一〔7〕号!='使用运算符,运算符右侧的字符串用作模式,并执行模式匹配。"其中"pattern"表示"glob"。
- @伊格纳西奥瓦兹奎兹·艾布拉姆斯·阿赫,那个双面人把我甩了。这是有意义的,因为==和=在operator部分(隐式)被声明为别名。
- @注:不可以。只有当[[不可用或不符合预期行为时,才应该使用[。
- @annjawn-在大多数系统中,[是命令test的别名,]的别名通常为Nothing(它只是因为匹配的大括号更容易读取)。[[是关键字,不是命令。
Also - under what circumstances should [ ] be used vs. [[ ]] and vice versa?
这要看情况而定。如果您关心可移植性并希望shell脚本在各种shell上运行,那么您不应该使用[[。如果您希望在某些shell上使用[[提供的功能,那么在需要这些功能时应该使用[[。就我个人而言,我从不使用[[,因为便携性对我很重要。
- 但是假设我不想使用[[ ]],但也想像上面的代码那样进行子字符串比较,我该怎么做呢?
- 你在找if echo"$filename" | grep -qF"$newfile"; then ...吗?
- 有点像,但没有grep。因此,如果我理解这一点,这是使我的代码在多个shell类型上兼容并避免使用[[的唯一方法。
- 这不是唯一的方法,你也可以做case"$filename" in *$newfile* ) ... 。
- 那么,您是否建议使用这些替代方法而不是使用[[ $var = *var2* ]]语法?
- @对我来说,可移植性非常重要,我通常在不支持[[语法的shell下运行脚本。在这种情况下,您必须使用这些(或某些其他)选项之一。如果您不介意将脚本限制在一组较小的shell下运行,那么使用[[可能是有意义的。