“[]”与“[[]]”在Bash shell中

这可能已经回答了,但我会反问。 我有两个版本的脚本( 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

有人可以解释我为什么区别?

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


test的字符串相等运算符不会做任何事情。

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

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

  • ==!=执行模式匹配,因此右侧可以是glob模式
  • =~!~执行正则表达式匹配。 捕获的组存储在BASH_REMATCH数组中。
  • 布尔运算符&&||
  • 没有词分裂,所以引用你的变量不是必须的。
  • 主要缺点:您的脚本现在是特定于bash的脚本。


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

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

    链接地址: http://www.djcxy.com/p/97041.html

    上一篇: "[ ]" vs. "[[ ]]" in Bash shell

    下一篇: Easiest Shell for C++/C#/Java Programmers