关于字符串:“[]”与Bash shell中的“[[]]”

“[ ]” 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

有人能解释一下为什么不同吗?

另外-在什么情况下,应该使用[ ][[ ]],反之亦然?


[[是一个内置的bash,不能在#!/bin/sh脚本中使用。您将需要阅读bash手册的条件命令部分来学习[[的功能。突然想到的主要好处是:

  • ==!=执行模式匹配,因此右侧可以是全局模式
  • =~!~执行正则表达式匹配。捕获的组存储在BASH_REMATCH数组中。
  • 布尔运算符&&||
  • 不需要分词,所以不必严格引用变量。

主要缺点:您的脚本现在是特定于bash的。


test的字符串相等运算符不执行globs。

1
2
3
4
$ [ abc = *bc ] ; echo $?
1
$ [[ abc = *bc ]] ; echo $?
0


Also - under what circumstances should [ ] be used vs. [[ ]] and vice versa?

这要看情况而定。如果您关心可移植性并希望shell脚本在各种shell上运行,那么您不应该使用[[。如果您希望在某些shell上使用[[提供的功能,那么在需要这些功能时应该使用[[。就我个人而言,我从不使用[[,因为便携性对我很重要。