/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。
[ ... ]
はプログラム"であり、多くの場合 は です。 'は通常ファイル/bin/[
または/usr/bin/[
にあります。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; liを思い出させます。 >
- " & ?
./someScript.sh & && echo 'ok' || echo 'ko'
- の形式で構文エラーが発生します:
foo && bar || baz
、foo
の場合成功すると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)
が真であるためには、expr1
とexpr2
の両方が真である必要があるためです。 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 を返しますか?