& &と||の紛らわしい使用演算子

/etc/rc.d/init.d/sendmailファイルをざっと調べていました(これはほとんど使用されていないことはわかっていますが、私は試験のために勉強している)、そして私は&&||演算子について少し混乱しました。次のようなステートメントで使用できる場所を読みました:

if [ test1 ] && [ test2 ]; then echo "both tests are true" elif [ test1 ] || [ test2 ]; then echo "one test is true" fi 

ただし、このスクリプトには次のような1行のステートメントが表示されます:

[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE" [ -f /usr/sbin/sendmail ] || exit 0 

これらは、&&および||演算子を使用して以下に基づいて応答を引き出しているようです。テストしましたが、これらの演算子のこの特定の使用に関するドキュメントを掘り下げることができませんでした。この特定のコンテキストでこれらが何をするかを誰かが説明できますか?

回答

&&は、左側の終了ステータスがゼロ(つまりtrue)の場合にのみ評価されます。 ||は反対です。左側の終了ステータスがゼロ以外(つまりfalse)の場合にのみ右側を評価します。

は戻り値のあるプログラムです。内部のテストがtrueと評価された場合、ゼロを返します。それ以外の場合はゼロ以外を返します。

例:

$ false && echo howdy! $ true && echo howdy! howdy! $ true || echo howdy! $ false || echo howdy! howdy! 

追記:

which [[が実際にプログラムを指していることがわかるかもしれません。ただし、通常は実際にはスクリプトで実行されるものではありません。type [を実行して、実際に実行される内容を確認してください。プログラムを使用したい場合は、次のようなフルパスを指定してください。つまり、/bin/[ 1 = 1

コメント

  • " XまたはY "、Xをテストします。'が真の場合、" XまたはY "(' true)なので、Yをテストする必要はありません。 '本当です、あなたは' " XまたはY <の答えを知りませんdiv id = "3a45b66681">

なので、Yをテストする必要があります。" XとY "が表示されたら、Xをテストします。'がfalseの場合、" XおよびY (it ' s false)、s o Yをテストする必要はありません。Xがtrueの場合、Yをテストして" XおよびY "がであるかどうかを確認する必要があります。 true。

  • "の代わりに左側がゼロを返す場合"、左側のコマンド'の終了ステータスがゼロの場合"。 " return "は、出力と終了ステータスの両方が"戻り値"
  • " 検討するだけでなく [ ... ]はプログラム"であり、多くの場合 です。 'は通常ファイル/bin/[または/usr/bin/[にあります。
  • Cプログラマーは、これが非常に混乱することに気付くでしょう。そこに0は偽を意味します…シェルスクリプトでは0は真を意味します…心が吹き飛ばされます。
  • @Calmarius ' Cに慣れている場合は、returnステータスであり、ブール値ではありません。return 0は成功を意味します。
  • 回答

    これが私のチートシートです:

    • “A; B “Aの成功に関係なく、Aを実行してからBを実行します
    • ” A & & B “Bを実行しますAが成功した場合
    • “A || B “Aが失敗した場合はBを実行します
    • ” A & “バックグラウンドでAを実行します。

    コメント

    • 'ここで行われているいくつかの興味深いラムダ計算の類似点がJavaScriptの動作で示されています(変数を順番に定義します); " left(aka true)":(a => b => a)。" right(別名false)":(a => b => b)。" A; B " "次に" (a => b => (() => b())(a()))。" A & & B " " else(when)" (a => b => a()(() => right)(b))がない場合。" A || B " " if(unless)" (a => b => a()(b)(() => right))。 " a & & b || c " " ifThenElse " (a => b => c => (unless(when(a)(b))(c))())
    • bashでは、左は類似の0 /空の文字列、右は類似の文字列であることに注意してください。
    • 単一の垂直バーはどうですか?

    回答

    @ Shawn-j-Goffの上記の回答を拡張するには、&&は論理ANDであり、||は論理ORです。

    この部分を参照してください。高度なBashスクリプトガイド。以下のユーザー参照用のリンクのコンテンツの一部。

    & & AND

    if [ $condition1 ] && [ $condition2 ] # Same as: if [ $condition1 -a $condition2 ] # Returns true if both condition1 and condition2 hold true... if [[ $condition1 && $condition2 ]] # Also works. # Note that && operator not permitted inside brackets #+ of [ ... ] construct. 

    ||または

    if [ $condition1 ] || [ $condition2 ] # Same as: if [ $condition1 -o $condition2 ] # Returns true if either condition1 or condition2 holds true... if [[ $condition1 || $condition2 ]] # Also works. # Note that || operator not permitted inside brackets #+ of a [ ... ] construct. 

    回答

    私の経験から、私は& &を使用しています。 d || ifステートメントを1行に減らすため。

    /root/Sample.txtというファイルを探しているとすると、従来の反復はシェルで次のようになります。

    if [ -f /root/Sample.txt ] then echo "file found" else echo "file not found" fi 

    これらの6行は1行に減らすことができます:

    [[ -f /root/Sample.txt ]] && echo "file found" || echo "file not found" 

    変数を設定するために数回の反復を実行する場合またはファイルなどを作成する場合、作業が簡単になり、if関数を使用するとスクリプトが滑らかに見えます。唯一の欠点は、1回の反復で複数のコマンドを実装するのが少し難しくなることですが、関数を使用することはできます。

    コメント

    • これはすばらしいです。objcコード(a == b)?val = 1:val = 2;
    • " & ?./someScript.sh & && echo 'ok' || echo 'ko'
    • の形式で構文エラーが発生します:foo && bar || bazfooの場合成功するとbarが失敗し、bazが実行されるため、ifステートメント。
    • &&{}括弧内に複数のコマンドを続けて実行できることに注意する必要があります。 div>または||(例:pidof udpxy > /dev/null 2>&1 && echo "udpxy is up!" || { echo "udpxy is down!"; /etc/init.d/udpxy restart; })。 if..then..elseはtrue /のより信頼性の高い"認識機能"であることにも言及する価値があります。 &&および||を使用するよりも誤った条件。

    回答

    「ショートカット」の概念があります。

    (expr1 && expr2)が評価されるとき-expr2は、exp1が「true」と評価された場合にのみ評価されます。これは、(expr1 && expr2)が真であるためには、expr1expr2の両方が真である必要があるためです。 expr1が「false」と評価された場合(expr1 && expr2)のため、expr2は評価されません(ショートカット)。はすでに「flase」です。

    次のことを試してください-ファイルF1が存在すると仮定します&ファイルF2は存在しません:

    ( [ -s F1 ] && echo "File Exists" ) # will print "File Exists" - no short cut ( [ -s F2 ] && echo "File Exists" ) # will NOT print "File Exists" - short cut

    ||(または)と同様ですが、短いですカットが逆になります。

    コメント

    • ロジックは通常、"短絡

    。 ' "ショートカット"が使用されているのを見たことがありません。参照を見つけるのに役立つようにこれについて言及します。

    回答

    Shawn J.Goffによる回答の例正しいですが、説明は逆です。確認してください:

    & &の右側左側の終了ステータスがNONZEROの場合にのみ評価されます。 ||反対です。左側の終了ステータスがゼロの場合にのみ右側を評価します。

    コメント

    • シェルの場合、ゼロの終了コードは true と評価されるため、ivの左側にある非ゼロの終了コードになります。 id = “90ef570c64″>

    の結果、式全体が false を返しますか?

  • 回答ではなかったため、誰かが編集を承認しませんでした。いくつかの答えが間違っていると思う場合は、それを否定し、おそらくコメントを残す必要があります。 変更が必要だと思われる場合は、コメントを残してください。 編集は、答えの意味を変えない文法、書式設定、スペルミスを修正するためのものです。
  • @countermode I '申し訳ありませんが、その通りです。 Linuxではゼロ= false、非ゼロ= true(Cや他の多くの言語/環境/プラットフォームのように)だと思いました。 誤解をお詫び申し上げます。
  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です