Bash shell中的"[]"与"[[]]"

Ann*_*awn 7 string bash shell scripting if-statement

这可能已经回答了,但无论如何我都会问它.我有两个版本的脚本(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!
Run Code Online (Sandbox Code Playgroud)

#!/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
Run Code Online (Sandbox Code Playgroud)

有人可以解释我为什么不同?

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

gle*_*man 14

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

  • ==!=执行模式匹配,因此右侧可以是glob模式
  • =~!~执行正则表达式匹配.捕获的组存储在BASH_REMATCH数组中.
  • 布尔运算符&&||
  • 没有单词拆分,所以引用你的变量并不是绝对必要的.

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


Ign*_*ams 6

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

$ [ abc = *bc ] ; echo $?
1
$ [[ abc = *bc ]] ; echo $?
0
Run Code Online (Sandbox Code Playgroud)

  • 我知道。但是为什么,你能详细说明为什么 `[ ]` 和 `[[ ]]` 有区别吗? (2认同)