2011-08-29 4 views
8

私は3g接続を照会するための簡単なスクリプトを書こうとしていますが、接続が切断された場合は再接続を促してください。2つの同一の文字列の私のbash文字列の比較が常に偽であるのはなぜですか?

私の問題は、コマンドの出力をチェックすることです.2つの一見等しい文字列は等しいと評価されません。私はそこにここにnoobエラーがあると確信しています!

#!/bin/bash 

echo "Checking connection" 
a="Not connected." 
b=$(./sakis3g status --console) 

if [[ "$a"!="$b" ]]; then 
    echo "Strings not equal:" 
    echo "$a" 
    echo "$b" 
else 
    echo "Strings equal!!" 
fi 

実行出力:

[email protected]:~$ ./test_3g.sh 
Checking connection 
Strings not equal: 
Not connected. 
Not connected. 

./test_3g.sh | cat -Aを実行している場合:

[email protected]:~$ ./test_3g.sh | cat -A 
Checking connection$ 
Strings not equal:$ 
Not connected.$ 
Not connected.$ 
+0

最後に余分な改行はありませんか? – Mehrdad

+2

'./test_3g.sh |を試してください。 cat -A'。あなたの 'cat'が' -A'オプションをサポートしていない場合は、 './test_3g.sh | cat -v'です。 –

+0

余分な空白はないとは思いますが、それで訂正されてうれしいです。 @Keith、パイプからの出力をcat -Aに質問に追加しました。 – jozzas

答えて

25

あなたは演算子の前後にスペースを入れる必要があります:

if [[ "$a" != "$b" ]]; then ... 

あなたは"$a!=$b"と同等の単一の文字列、で終わるスペースなし。その文字列が空でない場合は、文字列をテストするだけでtrueを返します。

+0

ありがとう、私はそれがnoobエラーであることを知っていた... – jozzas

+1

あなたは15秒で私を打つ! –

+3

スペースがないと、式は単一の文字列 '' Not connected! '=接続されていません。 bash式では、長さがゼロ以外の場合、文字列はtrueとして扱われます。 '[[STRING]]'は[[-n STRING]]に相当します。 ( 'info bash'、' \ [\ ['を検索し、" Bash条件式 "の注釈に従ってください) –

0

をおそらく標準出力の代わりにstderrにプログラムの印刷メッセージをsakis3g。この場合、メッセージを空の文字列と比較します。 stdoutに標準エラー出力をリダイレクトするようにしてください:

b=$(./sakis3g status --console 2>&1) 
+0

いいえ、それはそれをしなかった、申し訳ありません!あなたの追加の有無にかかわらず、結果は 'b'に格納されています。 – jozzas

5

case/esacを使用してください。 if/elseの微妙なニュアンスを

case "$a" in 
"$b") echo "ok";; 
*) echo "not ok";; 
esac 
関連する問題