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

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つの方法があるのですか?

コメント

  • = != < <= > >= 文字列を比較します。 1 -eq 011 != 01および8 -lt 428 > 42
  • 算術式で過負荷になっています。
  • ' bashの変更ログを検索して、各機能がいつだったかを確認する必要があります。追加されました。算術式はテストコマンドよりもかなり遅れて追加されたと思います。
  • 文字列の比較については質問していません。 @muru。

回答

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

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

  1. イディオムの内部[ ]算術比較の演算子は次のとおりです。 -eq-ne-lt-le-gtおよび-ge

    これらもテストコマンド内および[[ ]]

    このイディオム内では「はい」、=<などがあります。文字列演算子。

  2. イディオムの内部(( ))算術比較の演算子は==です。 、!=<<=>、および>=

    いいえ、これは「算術」ではありません。エティック拡張」($で始まる)を$(( ))として。これは、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

を参照してください。

算術式も

コマンド、

Kornシェル内、1980年代のある時点。それらは、Unixサークルで非常に人気のあるC言語の構文に従いました。したがって、彼らはCの演算子を使用しました:等しい場合は==、以下の場合は<=など。

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

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

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

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

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

[[ … ]]形式は、整数以外のものを含む条件を使用する場合に役立ちます。

回答

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

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

コメント

コメントを残す

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