sh 1つのコマンドでANDとOR

sh 1つのコマンドでANDとOR

1行のコードで3つの条件を確認しようとしました。

デフォルトでは、次のコードを記述する必要があります。

もし

文字列 1 は文字列 2 と同じではありません。

そして

文字列 3 は文字列 4 と同じではありません。

または

ブール1 = true

それから

「条件を満たす - コード実行中...」と表示されます。

コメントで尋ねたように、質問をより明確にするために例を更新しました。

#!/bin/sh

string1="a"
string2="b"
string3="c"
string4="d"
bool1=true

# the easy-to-read way ....
if [ "$string1" != "$string2" ] && [ "$string3" != "$string4" ] ; then
    echo "conditions met - running code ..."
fi

if $bool1 ; then
    echo "conditions met - running code ..."
fi

# or the shorter way ...
[ "$string1" != "$string2" ] && [ "$string3" != "$string4" ] && echo "conditions met - running code ..."

$bool1 && echo "conditions met - running code ..."

上記のコードは2回実行できます。最初の2つの条件が満たされた場合は再実行され、3番目の条件が満たされると再実行されます。これは私にとって必要なものではありません。

この例の問題は、2つの異なる「エコー」呼び出しが含まれていることです。 (注:実際のコードではエコーではありませんが、アイデアを得ることができます。)3つの条件付きチェックを1つのコマンドにまとめてコードの重複を減らそうとします。

今すぐ首を振りながら画面に向かって「それはまさに」と叫ぶ人々がいると確信しています。いいえあなたはそうしなかった方法! 」

これを重複としてマークするのを待っている人がいるかもしれません...まあ、私が見たしかし、私が読んだ答えを使ってこれを行う方法を見つけることができれば、呪われます。

誰かが私を実現できますか? :)

ベストアンサー1

これは働きます:

if    [ "$string1" != "$string2" ] \
   && [ "$string3" != "$string4" ] \
   || [ "$bool1" = true ]; then
    echo "conditions met - running code ...";
fi;

または、{ ;}読みやすさを高め、将来のメンテナンスを容易にするために囲まれています。

if { [ "$string1" != "$string2" ] && [ "$string3" != "$string4" ] ;} \
   || [ "$bool1" = true ] ; then
    echo "conditions met - running code ...";
fi;

指示:

  1. ブール変数のようなものはありません。
  2. 中括弧の末尾にはセミコロン({ somecmd;})が必要です。
  3. &&||評価して左から右へ上 -&&より優先します|| 内だけで(( ))そして[[..]]

&&[[ ]]より高い優先順位は、次の証明でのみ発生します。考えるbool1=true

そして[[ ]]

bool1=true
if [[ "$bool1" == true || "$bool1" == true && "$bool1" != true ]]; then echo 7; fi #1 # Print 7, due to && higher precedence than ||
if [[ "$bool1" == true ]] || { [[ "$bool1" == true && "$bool1" != true ]] ;}; then echo 7; fi # Same as #1
if { [[ "$bool1" == true || "$bool1" == true ]] ;} && [[ "$bool1" != true ]] ; then echo 7; fi # NOT same as #1
if [[ "$bool1" != true && "$bool1" == true || "$bool1" == true ]]; then echo 7; fi # Same result as #1, proved that #1 not caused by right-to-left factor, or else will not print 7 here

そして[ ]

bool1=true
if [ "$bool1" == true ] || [ "$bool1" == true ] && [ "$bool1" != true ]; then echo 7; fi #1, no output, due to && IS NOT higher precedence than ||
if [ "$bool1" == true ] || { [ "$bool1" == true ] && [ "$bool1" != true ] ;}; then echo 7; fi # NOT same as #1
if { [ "$bool1" == true ] || [ "$bool1" == true ] ;} && [ "$bool1" != true ]; then echo 7; fi # Same as #1
if [ "$bool1" != true ] && [ "$bool1" == true ] || [ "$bool1" == true ]; then echo 7; fi # Proved that #1 not caused by || higher precedence than &&, or else will not print 7 here, instead #1 is only left-to-right evaluation

おすすめ記事