2016-08-02 15 views
0

場合には、私は以下の条件があります。Bashの整数と文字列の条件付きで、&&と||文のbashスクリプトで

if [ $cnt -eq 1 ] && [[ $str != *"something 1"* || $str != *"something 2"* ]] 

期待どおりに動作していません。これはBashでも可能ですか?もしそうなら、正しい構文は何ですか?望ましい動作は、$cnt -eq 1がtrueで、$str != *"something 1"*または$str != *"something 2"*のいずれかがtrueの場合、if文がtrueを返すことです。

+2

構文は問題ありません。なぜそれが間違っていると思いますか? '$ cnt'と' $ str'の値を期待値と一緒に期待値としないでください。 – chepner

+1

well - '[$ cnt -eq 1]'は、 'cnt'が空、未定義、あるいは複数の単語に展開されている場合に、より有用なことを行うのではなく、文法エラーを投げかけます。 '(" $ cnt "-eq 1)'はこれらの事例を避けますが、 '((cnt == 1))'は読みにくい(未設定値を0のように扱います)。しかし、本当に*その変数に一つの数値があると仮定すると、 'IFS'には数字も含まれていないので、引用符がないと直ちにバグは発生しません。まだここに再生器がない。 –

+0

... more bluntly: "うまくいかない"というバグレポートはありません。 –

答えて

1

これは構文上の問題ではありませんが、論理的な問題だと私は確信しています。式[[ $str != *"something 1"* || $str != *"something 2"* ]]は、$str,のパターンに一致しない限り真です。私が何をしたいこと$strはあなたが&&代わりの||を必要とする意味のいずれかのパターンと一致しない場合にtrue何かだと思う

$ str="foo no pattern bar" 
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false 
true 
$ str="foo something 1 bar" 
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false 
true 
$ str="foo something 2 bar" 
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false 
true 
$ str="foo something 1 something 2 bar" 
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false 
false 

::考えてみて、これがある理由を理解するには

$ str="foo no pattern bar" 
$ [[ $str != *"something 1"* && $str != *"something 2"* ]] && echo true || echo false 
true 
$ str="foo something 1 bar" 
$ [[ $str != *"something 1"* && $str != *"something 2"* ]] && echo true || echo false 
false 
$ str="foo something 2 bar" 
$ [[ $str != *"something 1"* && $str != *"something 2"* ]] && echo true || echo false 
false 

をチェックDe Morgan's lawsのうちの1つは、「not(AまたはB)」は「(Aではない)と(Bではなく)」と同じであると言う。

+0

こんにちはゴードン、そうですよ! ||からの変更&&は私の問題を解決しました。ありがとうございました! – Nate650