bash:ブール演算と単項「!」

bash:ブール演算と単項「!」

私はこのコードを見つけました。本物その年がうるう年の場合、間違ったそれ以外の場合。yearコマンドラインから読み取ったユーザー入力。

(( !(year % 4) && year % 100 || !(year % 400) )) && echo "true" || echo "false"

1ドルはどうですか?目的の結果を得るためにbashとして実装されていますか?

算術コマンドの戻り値について私が知っていること: ((10 > 6)); echo "$?"#出力0。算術コマンドはtrueの場合は0を返します。

上記のコマンドの戻り値、つまり終了コードを呼び出すことはできますか?

私が知っているすべて:'! '値をブール値に強制するだけでなく、パリティも反転します。

ベストアンサー1

!(year % 4)算術的文脈では、結果が最初に取り込まれ、year % 40と3の間の値が計算されます。値が0(year4の倍数)の場合、全体演算の結果は1(!0)で、そうでなければ!1、、、!2またはです!3。これらはすべてゼロと評価されます。

これは、ほとんどの言語で整数のブール値を評価するための標準的な慣行です。

0 && 3ブール算術評価では整数ゼロが偽であるため、次のような演算が可能です。

これ終了コードコマンドの値(( 10 > 6 ))は0です。これは、たとえば(1)などから得られる出力とは異なりますecho "$(( 10 > 6 ))"。終了コードは「成功」または「失敗」を示します。テストが正常に実行されたため、0 が返されます。算術的文脈で比較を使用する場合、その値は1になります。

(( var = 10 > 6 ))
echo "$var"   # prints 1

!動作原理は、算術的文脈を除いて同じです。 0 を 1 に変更し、0 以外を 0 に置き換えます。これ説明するしかし、シェルはこれを異なって理解しています。 0は「ブールエラー」ではなく「成功」を意味します(シェルユーティリティを「成功」ではなく「失敗しない」と考える方が慣れている場合はこれは驚くべきことではありません)。

grep -q -e PATTERN file && echo 'grep did not fail (and found PATTERN)'

! grep -q -e PATTERN file && echo 'grep failed (and did not find PATTERN)'

Unixでは、ゼロ戻りコードは、追加情報を渡す必要がないため、「成功」を示します。

ゼロ以外の終了コードは失敗を引き起こします。失敗の性質は、終了コードの実際の値で表されます。有効なエラーコードは1〜127です。これらの意味はユーティリティマニュアルに文書化する必要があります。上記の終了状態は、ユーティリティが信号によって終了した場合の状態です。

おすすめ記事