Bashでは、条件式を使用して2つの整数を比較できます。
アルギニン1OPアルギニン2
-eq
OPは-ne
、、、-lt
または-le
のいずれかです。これらの算術バイナリ演算子は、次の場合にtrueを返します。-gt
-ge
アルギニン1等しい、等しくない、小さい、小さい、等しい、大きい、大きい、または等しいアルギニン2、それぞれ。アルギニン1そしてアルギニン2正または負のどちらでもかまいません。
または算術式:
<= >= < >
比較する
== !=
平等と不平等
2つの整数を比較する2つの方法があるのはなぜですか?いつどれを使うべきですか?
たとえば、[[ 3 -lt 2 ]]
条件式を使用し、(( 3 < 2 ))
算術式を使用します。比較が真の場合、両方とも0を返します。
2つの整数を比較するとき、これら2つの方法を交換して使用できますか?それでは、なぜBashには1つではなく2つの方法がありますか?
答え1
はい、2つの整数を比較する2つの方法があります。
これらの事実は、このフォーラムで広く受け入れられていないようです。
このイディオムで
[ ]
算術比較に使用される演算子は-eq
、、、-ne
および-lt
です-le
。-gt
-ge
彼らはまた、コマンドと
[[ ]]
。はい、このイディオムでは、
=
など<
は文字列演算子です。このイディオムで算術比較
(( ))
に使用される演算子は==
、、、、、および!=
です。<
<=
>
>=
$
いいえ、これは「算術拡張」(で始まる)ではありません$(( ))
。 man bash では、「複合コマンド」として定義されます。はい、「算術拡張」(内部的に)と同じ規則に従いますが、出力はなく、終了値のみがあります。次のように使用できます。
if (( 2 > 1 )); then ...
2つの整数を比較する2つの異なる方法があるのはなぜですか?
(( ))
私は後者が算術テストを実行するより簡単な方法で開発されたと思います。とほぼ同じです$(( ))
が、出力はありません。
なぜ2人の個人ですか?これは、2つのprintf
テスト(外部と組み込み)または4つのテスト(外部test
、組み込み、およびtest
)があるのと同じ理由です。これが樹皮が成長するように、一部の領域は年に改善され、他の領域は翌年に改善されます。[
[[
いつどれを使うべきですか?
有効な違いがあってはいけないので、これは非常に難しい質問です。もちろん、aの動作[ ]
方法とaの内部動作方法には若干の違いがあります(( ))
。しかし、2つの整数を比較するにはどちらが良いですか?誰でも! 。
2つの整数を比較するとき、これら2つの方法を交換して使用できますか?
両方の数字について私はそうだと答えなければなりません。
ただし、変数、拡張、数学演算の場合は、どちらかを優先する主な違いがあります。どちらも絶対に等しいとは言えません。まず、(( ))
複数の数学演算を順次実行できます。
if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi
それでは、なぜBashには1つではなく2つの方法がありますか?
どちらも役に立つとしたらどうしますか?
答え2
歴史的に、このtest
命令は最初に存在しました(少なくともUnix バージョン 71979).文字列を比較するには=
and演算子を使用し、数値を比較するにはなどを使用します。例えば、それは偽ですが、本当です。この構文が選択された理由はわかりませんが、おそらくシェルがリダイレクト演算子で解析するための使用を避けるためです。数年後、このコマンドでは。!=
-eq
-ne
-lt
test 0 = 00
test 0 -eq 00
<
>
test
[ … ]
test …
条件付き構文[[ … ]]
(<
および>
引用符なしの演算子として使用できます)は後でkshに追加されました。以前のバージョンとの互換性を維持するため、[ … ]
同じ演算子を使用しますが、文字列を比較する<
ために合計を追加します>
(例:[[ 9 > 10 ]]
but [[ 9 -lt 10 ]]
)。詳細については、次を参照してください。シングルまたはダブルカッコの使用 - bash
算術式もtest
コマンドより遅く表示されます。Korn シェルから、1980年代のある日。これはUnix系で非常に人気のあるC言語の構文に従います。だから彼らはCの演算子(==
等しい、<=
小さい、等しいなど)を使いました。
Unixバージョン7には算術式はありませんでしたが、expr
注文する、比較演算子を含む整数算術のための C と同様の構文も実装します。シェルスクリプトでは、文字<
と>
シェルを保護するために引用する必要があります。つまり、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 …
[[ … ]]
この形式は、整数以外の項目に関連する条件を使用したい場合に便利です。
答え3
テストマニュアルページによると、=と!=は文字列比較に使用され、-eq、-gt、-lt、-ge、-le、および-neの式は整数比較に使用されます。私はシェルスクリプトを書くときはいつもこの規則に従い、いつも動作します。式に変数がある場合は、NULL比較を避けるために何らかの方法で変数を参照する必要があります。
書類では考えずに文字列/数値比較を行います。一方、コンピュータは987が数字であるか文字列であるかを知りません。正しい結果を得るには、コンピュータに何をすべきかを示すさまざまな演算子が必要です。いくつかの追加情報があります。こここれはいくつかの歴史を説明します。デフォルトでは、これらの変数は型指定されておらず、記録の互換性のためにそのまま残ります。