2012-03-12 19 views
20

私はbashスクリプティングには新しく、二重括弧を使用すると問題に遭遇しています。私はUbuntu Server 11.10でそれらを動作させることはできません。私のスクリプトはif_test.shにあります。bash double bracket問題

#!/bin/bash 

if [[ "14"=="14" ]]; then 
    echo "FOO" 
fi 

私はこの単純なシェルスクリプトを実行すると、私が手に出力されている:if_test.sh:5:[[:見つからない

私が実行した後にGNUのbashのバージョン4.2.10を実行しているようですbash - 端末からのバージョン。どんな助けでも大歓迎です。ありがとう!

+0

ところで、スペースがない場合、これは「14」と「14」を比較していないので、文字列「14 == 14」が空であるかどうかを確認しています。その文字列も空ではないので、 '[[" 11 "==" 99 "]]'と全く同じ結果が得られます。 –

答えて

35

問題はスクリプトの呼び出しにあります。 、Ubuntuのシステムでは

$ sudo sh if_test.sh 

/bin/shis dash, not bash、およびdashは、ダブルブラケットキーワードをサポートしていない(または、この投稿の時点ではなかった、私はダブルチェックしていない):あなたが発行しています。あなたは明示的に代わりbashを呼び出すことによって、あなたの問題を解決することができます:

また
$ sudo bash if_test.sh 

、あなたのスクリプトの実行可能ファイルを作成し、shebang lineに頼ることができます。

$ chmod +x if_test.sh 
$ sudo ./if_test.sh 

二重の角括弧の間で使用される場合にも、ことに注意してください==pattern matching operatorであり、等価演算子ではありません。あなたが平等のためにテストする場合は、-eqを使用することができ、次のいずれか

if [[ "14" -eq "14" ]]; then 
    echo "FOO" 
fi 

またはdouble parentheses

if ((14 == 14)); then 
    echo "FOO" 
fi 
+0

私は[["" 14 "-eq" 14 "]を試しても同じエラーが出ます。 –

+0

奇妙なことに、 '[['キーワードは 'bash'のバージョン2.02以降でサポートされています。あなたはどのようにあなたのスクリプトを実行していますか?たぶんあなたは別のシェルを使用して終わるでしょう... –

+0

私はそれを実行しています:sudo sh if_test.sh –

6

あなたは、スクリプトに新しいしているので、あなたは[[がbashismであることに気づかないかもしれません。あなたはbashismが何であるかを知ることさえできないかもしれませんが、これまでに与えられた両方の答えは、あなたの使い方を促進することによって、スクリプトの未来への道を導いています。

Bourneシェルのフレーバーで変数が文字列と一致するかどうかを確認するには、test $V = 14を実行します。整数を比較する場合は、test $V -eq 14を使用します。唯一の違いは、$ Vが整数のように見えない場合、後者はエラーを生成することです。変数(test "$V" = 14)を引用する良い理由がありますが、引用符はしばしば不要であり、"14"=="14""14==14"と同じであるため、一般的な混乱の根本的な原因と考えられます。 '=='が使用されていないことがより明白です。オペレータとして

は、注意すべきいくつかのことがあります使用し、単一の「=」の代わりに「==」すべてのシェルが認識「==」、[コマンドはtestと同じですが、]、多くのshの最後の引数を必要としないので、コーディングガイドラインでは、testを使用することをお勧めします。[[は、制限された数のシェルのみで認識されます(シェルが[[を認識しておらず、その名前のコマンドを探しているため、あなたのシバンが実際に/bin/shの代わりに/bin/bashを指定している場合は驚くべきことです)。

4

私の答えは、具体的@ lots_of_questionsの質問には適用されませんが、あなたのスクリプトの先頭に誤った指定がある場合にも、この問題に遭遇することができます

#!/bin/sh 
if [[ ... ]] 
... 

あなたは

にそれを変更する必要があります
#!/bin/bash 
if [[ ... ]] 
... 
関連する問題