13

这可能已经回答了,但我还是要问它。我有两个版本的脚本 ( comp.sh)-

#!/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!

#!/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

有人可以解释一下为什么有区别吗?

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

4

3 回答 3

18

[[是内置的 bash,不能在#!/bin/sh脚本中使用。您需要阅读 bash 手册的条件命令部分来了解[[. 想到的主要好处:

  • ==!=执行模式匹配,所以右边可以是一个 glob 模式
  • =~执行正则表达式匹配。捕获的组存储在BASH_REMATCH数组中。
  • 布尔运算符&&||
  • 括号用于表达式分组。
  • 没有分词,所以没有必要引用你的变量。

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

于 2012-08-22T00:00:40.793 回答
9

test的字符串相等运算符不做 glob。

$ [ abc = *bc ] ; echo $?
1
$ [[ abc = *bc ]] ; echo $?
0
于 2012-08-21T22:02:19.597 回答
3

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

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

于 2012-08-21T22:33:45.037 回答