2013-08-07 3 views
6

4行目のエラーはどこですか?あなたは、単一のブラケットのために==を使用することはできませんbash文字列の等価性テストで予期しない演算子エラーが発生するのはなぜですか?

for fi in /etc/uwsgi/apps-available/* 
do 
     bn=`basename $fi .ini` 
     if [ $bn == "README" ] 
     then 
       echo "~ ***#*** ~" 
     else 
       echo "## Shortend for convience ##" 
     fi 
done 
+1

'if [$ bn ==" README "]'で動作するはずです。 – fedorqui

+0

元のスクリプトでその変更を加えようとしましたが、まだエラーが発生します。私は多くのテストをしました。 rme = READMEを設定した場合、単純なテストでどちらかまたは両方のサイトの引用符で、次に例を実行します。[$ rme == README] && echo "equal";出力は等しい。スペースがどこにあるかは問題ありません。もちろん、あなたがスペースの一方の側にスペースを置くと、スペースが他方のスペースになければなりません。 (私はbashを知っています。)私は迷子を持っていて、エラーの行を修正したり変更したりしなかった場合に備えてセミコロンを編集しました。 –

+0

コードが新しいエラーを出しているので、あなたの質問を更新してください。私はテストディレクトリでREADMEファイルに触れ、あなたのコードは 'if [$ bn ==" README "]'という私の以前の提案で私に働きかけました。 – fedorqui

答えて

8

:私は

if [ $bn == README ] 
then 

または

if [ "$bn" == "README" ]; then 

としてコンテキストをそれを書く場合、私はまだ取得

if [ $bn == README ]; then 

比較([])。代わりにsingle =を使用してください。また、展開を防ぐために変数を引用する必要があります。

if [ "$bn" = README ]; then 

あなたは[[]]を使用する場合、それが適用できるとあなたが最初の引数を引用する必要はありません。

if [[ $bn == README ]]; then 
+0

Xmm ... 'bash 3.2.25'では、' == 'は' [...] '構文で動作します。おそらくそれはバージョン固有のものです。 – user000001

+2

@ user000001 _bash_、yes、 '=='では動作しますが、拡張機能です。POSIX標準では動作させる必要はないので、正当な理由がなくても移植性のないコードを書いています。 –

+0

移植性に優れた先端!そして、これは意図した方法で正確に解決していませんでした。しかし、会話は私に気づかせてくれました。私は言いたいことを恥ずかしく思います。私は思ったんだけどね。私はデフォルトでshを使っていました。私は行#!/ bin/bashを忘れてしまい、実行するためにbash scriptnameを使用していませんでした。 #!/ bin/bashを追加すると問題が解決しました。 –

3

は、スクリプトの先頭に次の行を追加します。

#! /bin/bash 

bashでは、==is the sameとして=を使用しています。しかし、これは移植性がありません。したがって、スクリプトの先頭に#! /bin/bashを置くことによって、bashをスクリプトのインタプリタとして使用するようにシェルに明示的に指示する必要があります。

または、=を使用して文字列の比較を行います。 ==オペレータは、の動作が、別の場合はの場合、ダブルブラケットの内部では、シングルブラケットの内部よりも(リンク参照)動作することに注意してください。

関連する問題