13

これはすでに回答されているかもしれませんが、とにかく質問します。2 つのバージョンのスクリプトがあります ( 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

[[#!/bin/shは bash 組み込みであり、スクリプトでは使用できません。の機能を学習するには、bash マニュアルの条件付きコマンドのセクションを読むことをお勧めします[[。心に浮かぶ主な利点:

  • ==パターン マッチングを!=実行すると、右側がグロブ パターンになる可能性があります。
  • =~正規表現マッチングを実行します。キャプチャされたグループはBASH_REMATCH配列に格納されます。
  • ブール演算子&&||
  • 式をグループ化するための括弧。
  • 単語分割がないため、変数を引用符で囲む必要はありません。

主な欠点: スクリプトは現在 bash 固有です。

于 2012-08-22T00:00:40.793 に答える
9

testの文字列等価演算子はグロブを行いません。

$ [ 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?

場合によります。移植性を重視し、シェル スクリプトをさまざまなシェルで実行したい場合は、[[. [[一部のシェルで提供される機能が必要な[[場合は、それらの機能が必要なときに使用する必要があります。個人的には[[、携帯性が重要なので、私は決して使用しません。

于 2012-08-21T22:33:45.037 に答える