整数の比較:算術式または条件式


20

Bashでは、条件式を使用して2つの整数を比較できます

arg1 OP arg2

OPはの一つである-eq-ne-lt-le-gt、または-ge。これらの算術二項演算子は、arg1がそれぞれarg2と等しい、等しくない、より小さい、以下、より大きい、またはより大きい場合にtrueを返します。Arg1およびarg2は、正または負の整数です。

または算術式:

<= >= < > 比較

== != 平等と不平等

2つの整数を比較する方法が2つあるのはなぜですか?どちらを使用するか?

たとえば、[[ 3 -lt 2 ]]条件式と(( 3 < 2 ))算術式を使用します。比較がtrueの場合、両方とも0を返します

2つの整数を比較する場合、これらの2つの方法は常に同じ意味で使用できますか?はいの場合、なぜBashには1つではなく2つのメソッドがあるのですか?


1
= != < <= > >=文字列を比較します1 -eq 01しかし1 != 018 -lt 42しかし8 > 42
-dave_thompson_085

それらは算術式でオーバーロードされます。
ティム

1
各機能がいつ追加されたかを確認するには、bashの変更ログを検索する必要があります。算術式は、テストコマンドよりもずっと後に追加されたと思われます。
グレンジャックマン

私は文字列を比較することを求めていません。@muru。
ティム

回答:


28

はい、2つの整数を比較する2つの異なる方法があります。

これらの事実はこのフォーラムで広く受け入れられていないようです:

  1. イディオム内部[ ]算術比較するための演算子は-eq-ne-lt-le-gt-ge

    また、テストコマンド内および[[ ]]

    はいこの慣用句の内部、=<、などの文字列演算子です。

  2. イディオム内部(( ))算術比較するための演算子は==!=<<=>、と>=

    いいえ、これは、(Aで始まり、「算術展開」ではない$ように)$(( ))。これは、man bashの「複合コマンド」として定義されています。

    はい、「算術展開」と同じ規則(内部)に従いますが、出力はなく、終了値のみがあります。次のように使用できます。

if (( 2 > 1 )); then ...

2つの整数を比較する方法が2つあるのはなぜですか?

後者(( ))は算術テストを実行するためのより簡単な方法として開発されたと思います。これはほとんどと同じ$(( ))ですが、出力がありません。

なぜ2つ?2つprintf(外部および組み込み)または4つのテスト(外部test、組み込みtest[および[[)がある理由と同じです。それは貝が成​​長する方法であり、1年で一部の領域を改善し、翌年には他の領域を改善します。

どちらを使用するか?

効果的な違いはないはずなので、それは非常に難しい質問です。もちろん、[ ]作品と(( ))内部の作品にはいくつかの違いがありますが、2つの整数を比較する方が良いでしょうか?誰でも!。

2つの整数を比較する場合、これらの2つの方法は常に同じ意味で使用できますか?

2つの数字については、「はい」と言わざるを得ません。
しかし、変数、展開、数学的操作については、どちらか一方に有利な重要な違いがあるかもしれません。絶対に両方が等しいとは言えません。1つは、(( ))複数の数学演算を順番に実行できることです。

if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi

はいの場合、なぜBashには1つではなく2つのメソッドがあるのですか?

両方が役立つ場合は、なぜですか?


1
=は割り当てであり==、算術展開の比較です。質問はそれを正しく引用しています。しかし、答えは間違っています。
18

12

歴史的に、testコマンドは最初に存在しました(少なくとも1979年のUnix Seventh Editionにまでさかのぼります)。これは、演算子を使用=して!=文字列を比較するために、そして-eq-ne-lt数字を比較するなど、。たとえば、test 0 = 00はfalseですがtest 0 -eq 00、trueです。この構文が選択された理由はわかりませんが、シェルがリダイレクト演算子として解析する<andの使用を避けるためであった可能性があります>testコマンドは、数年後、別の構文を得た:[ … ]と同等ですtest …

[[ … ]]条件構文、内側<及び>引用することなく演算子として使用することができるが、kshの中に、後添加しました。との後方互換性を維持した[ … ]ため、同じ演算子を使用しましたが<>文字列を比較および追加しました(たとえば、[[ 9 > 10 ]]but [[ 9 -lt 10 ]])。詳細については、シングルまたはダブルブラケットの使用を参照してください-bash

1980年代のある時点で、Kornシェルではtest、算術式もコマンドよりも後になりました。彼らはC言語の構文に従いました。これはUnix界で非常に人気がありました。したがって、彼らはCの演算子を使用しました:等式、以下、等==<=

Unix Seventh Editionには算術式はありませんでしたが、比較演算子を含む整数演算用のCのような構文も実装したexprコマンドがありました。シェルスクリプトでは、文字<>を引用符で囲んでシェルから保護する必要がありif expr 1 \< 2; …ましたif test 1 -lt 2; …。たとえば、と同等です。シェルへの算術式の追加により、ほとんど使用さexprれなくなったため、今日ではあまり知られていません。

shスクリプトでは、通常、算術式を使用して整数値を計算し、整数[ … ]を比較します。

if [ "$((x + y))" -lt "$z" ]; then 

ksh、bash、またはzshスクリプトでは((…))、両方に使用できます。

if ((x + y < z)); then 

この[[ … ]]形式は、整数以外のものを含む条件を使用する場合に便利です。


1

テストのマニュアルページによると、=および!=は文字列の比較に使用され、式-eq、-gt、-lt、-ge、-le、および-neは整数の比較です。シェルスクリプトを記述するときは、常にこの規則に従い、常に機能します。式に変数がある場合、null比較を回避するために、何らかの方法で変数を引用する必要がある場合があることに注意してください。

紙の上では、あまり考えずに文字列/数値の比較を行います。一方、コンピューターは987が数字であるか文字列であるかを知りません。適切な結果を得るには、コンピューターに何をすべきかを伝えるためにさまざまなオペレーターが必要です。ここには、いくつかの歴史を説明する追加情報があります。本質的に、変数は型指定されておらず、歴史的な互換性のためにそのままです。


私の投稿では、= and !=は算術演算子ですが、のマンページにtestは条件式演算子のみが示されています。
ティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.