Bashでは、条件式を使用して2つの整数を比較できます
arg1 OP arg2
OPは
-eq
、
、-lt
、-le
、-gt
、または-ge
。これらの算術二項演算子は、 arg1 が arg2 に等しい、等しくない、より小さい、以下、より大きい、または等しい場合にtrueを返します。それぞれ。 Arg1 および arg2 は、正または負の整数です。
または算術式:
<= >= < >
比較
== !=
同等性と不等式
2つの整数を比較する方法が2つあるのはなぜですか?いつどちらを使用しますか?
たとえば、[[ 3 -lt 2 ]]
は条件式を使用し、(( 3 < 2 ))
は算術式を使用します。比較が真の場合、両方とも0を返します
2つの整数を比較する場合、これら2つの方法は常に交換可能に使用できますか?はいの場合、なぜBashには1つではなく2つの方法があるのですか?
コメント
回答
はい、2つの整数を比較する方法は2つあります。
これらの事実は、このフォーラムでは広く受け入れられていないようです。
-
イディオムの内部
[ ]
算術比較の演算子は次のとおりです。-eq
、-ne
、-lt
、-le
、-gt
および-ge
。これらもテストコマンド内および
[[ ]]
。このイディオム内では「はい」、
=
、<
などがあります。文字列演算子。 -
イディオムの内部
(( ))
算術比較の演算子は==
です。 、!=
、<
、<=
、>
、および>=
。いいえ、これは「算術」ではありません。エティック拡張」(
$
で始まる)を$(( ))
として。これは、manbashでは「複合コマンド」として定義されています。はい、「算術展開」と同じルール(内部)に従いますが、出力はなく、終了値のみです。次のように使用できます。
if (( 2 > 1 )); then ...
2つの整数を比較する方法が2つあるのはなぜですか?
後者の(( ))
は、算術テストを実行するためのより簡単な方法として開発されたと思います。 $(( ))
とほぼ同じですが、出力がありません。
なぜ2つですか? 2つのprintf
(外部および組み込み)または4つのテスト(外部test
、組み込み、[
および[[
)。それが貝殻の成長の仕方であり、1年で一部の領域が改善され、翌年には他の領域が改善されます。
いつ使用するのですか?
それは非常に難しい質問です。効果的な違いはないはずです。もちろん、[ ]
と(( ))
の内部動作にはいくつかの違いがありますが、2つの整数を比較する方が良いでしょうか。誰でも!。
2つの整数を比較するとき、これら2つの方法は常に同じ意味で使用できますか?
2つの数値については、「はい」と言わざるを得ません。
ただし、変数については、展開、数学演算には、どちらか一方を優先する重要な違いがある場合があります。絶対に両方が等しいとは言えません。 1つは、(( ))
が複数の算術演算を順番に実行できることです。
if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi
はいの場合、Bashにはなぜ1つではなく2つの方法?
両方が役立つ場合は、なぜですか?。
コメント
-
=
は割り当てであり、==
は算術展開の比較です。質問はそれを正しく引用しています。しかし、答えは間違っています。 - また、
(
はbashの予約語ではないため、((
の前後にスペースを入れる必要はありません。[
または[[
回答
歴史的には、test
コマンドが最初に存在していました(少なくとも Unix第7版 1979年)。演算子=
と!=
を使用して文字列を比較し、-eq
、-ne
、-lt
などで数値を比較します。たとえば、test 0 = 00
はfalseですが、test 0 -eq 00
はtrueです。この構文が選択された理由はわかりませんが、シェルにある<
と>
の使用を避けた可能性があります。リダイレクト演算子として解析されます。test
コマンドは、数年後に別の構文を取得しました。[ … ]
はtest …
。
[[ … ]]
条件付き構文。その中には、<
と>
は引用符なしで演算子として使用でき、後でkshで追加されました。[ … ]
との下位互換性を維持したため、同じ演算子を使用しましたが、
と>
を使用して、文字列を比較します(たとえば、[[ 9 > 10 ]]
ですが[[ 9 -lt 10 ]]
)。詳細については、シングルまたはダブルブラケットの使用-bash
を参照してください。
算術式も
コマンド、
= != < <= > >=
文字列を比較します。1 -eq 01
が1 != 01
および8 -lt 42
が8 > 42