2013-04-12 21 views
24

ホストに応じていくつかのパスを設定したいのですが、残念ながら動作しません。ここに私のスクリプトは次のとおりです。

if [$HOSTNAME == "foo"]; then 
    echo "success" 
else 
    echo "failure" 
fi 

これは何が起こるかです:

-bash: [foo: command not found 
failure 

私は$ HOSTNAMEがfooであることを確実に知っているので、私は問題が何であるかわかりません。私はかなりbashに新しいです。どんな助けもありがとう!ありがとう!

+2

ヒント:シェルは空白に敏感です。 '[x'は' [x'とは異なります。 – Jens

+2

ヒント:文字列の等価性のテスト演算子は、エラーメッセージの少ないプログラマを容易にするための誤った試みでバグのあるシェルによって受け入れられても、 '== 'ではなく' = 'です。 – Jens

答えて

41

シェルで文字列を比較するためにPOSIXとポータブルな方法が

if [ "$HOSTNAME" = foo ]; then 
    printf '%s\n' "on the right host" 
else 
    printf '%s\n' "uh-oh, not on foo" 
fi 

あるcase文はしかし、より柔軟であり:

case $HOSTNAME in 
    (foo) echo "Woohoo, we're on foo!";; 
    (bar) echo "Oops, bar? Are you kidding?";; 
    (*) echo "How did I get in the middle of nowhere?";; 
esac 
+1

1つまたは2つの同等? – fedorqui

+1

1つだけです。それはPOSIXです。それ以外のものは、偽のシェルで、それ以上のものを受け入れ、 '=='準拠していないスクリプトを宣伝します。 – Jens

+0

興味深いことに、私はそれを反映するために私の答えを更新する。 – fedorqui

0

オープニングブラケットの後ろにスペースがありません。それは二重引用符を使用して変数の内容を「解析しない」にも良いことだ:

if [ "$HOSTNAME" = "foo" ]; then 
... 
+0

Double '=='はバグです。等価演算子は '='です。いくつかのシェルは広範な無知のためにそれを受け入れるだけです:-) – Jens

+0

あなたは正しく100%POSIXではないと思っていますが、動作すれば常に==を使う傾向があります。 – Danstahr

+0

"もしそれがうまくいく"姿勢を考え直すべきです。一般的なシェルではうまく動作しませんが、その時代以来Unixではいつでも動作します。ある日、あなたはそのようなシステムであなた自身を見つけるでしょう。 Solarisについて聞いたことがありますか?そして=は、==よりも入力するのが少なくて済みます。 – Jens