Bashのマニュアルでは、セクション6.5 Shell Arithmeticは次のように述べています。
<= >= < > comparison
== != equality and inequality
&& logical AND
|| logical OR
その意味は条件式に使われるという意味のようです。ただし、算術式セクションには表示されます。
その後、以下で使用できます。条件式?
<=,>=,<,>,==,!=
セクション 6.4 には、算術式に似た条件式の演算子がすでにあります。arg1はarg2で動作します。
OP は、「-eq」、「-ne」、「-lt」、「-le」、「-gt」、または「-ge」のいずれかです。これらの算術バイナリ演算子は、arg1がそれぞれarg2と等しい、等しくない、小さい、小さい、等しい、大きい、大きい、または等しい場合はtrueを返します。 Arg1 と arg2 は正または負のいずれかです。
算術式の合計に似た条件式の演算子もすでにあります
&&
。||
-a
彼-o
についてtest
[...]
&&
そして||
。[[...]]
さて、条件式の演算子を導入しましたが、なぜ算術式に同様の演算子を導入するのですか?
それらは次のために使用することができますテストコマンド?
私たちは、
if
次がテストコマンドであることを知っています。if コマンドの構文は次のとおりです。
if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
[...]
どちらも[[...]]
条件式を取り、テストコマンドを生成します。算術式を使用できますか?私をさらに混乱させることは、その中の算術式が
[...]
テスト[[...]]
コマンドとして使用されたときに[...]
正しく動作しないということです[[...]]
。$ if [ 1 > 2 ]; then echo h; else echo b; fi h $ if [ 1 < 2 ]; then echo h; else echo b; fi h $ if [[ 1 < 2 ]]; then echo h; else echo b; fi h $ if [[ 1 > 2 ]]; then echo h; else echo b; fi b
答え1
これはとても簡単です。あなたは理解し[]
、全く別の獣でなければなりません[[]]
。(())
[ expression ]
bashのすべてのコマンド呼び出しと同様に、式を引数として使用してプログラムを呼び出すだけです[
(別の名前)。test
つまり、特に after[
と before の間にスペースを使用し]
、キーワードと特殊文字をエスケープまたは引用し、変数を一般的な方法で拡張する必要があります。
式では-gt, -lt
、関連は数値比較に使用され、>, <
ソートは文字列比較に使用されます。[
これはbashとは何の関係もなく、すべてのプログラムと同様に、0(true)または0以外(false)を評価して返す式を呼び出すコマンドであると考えることができます。
ブール演算子&&
とは||
bashによって解釈され、引数として渡されないため使用できませんtest
。代わりに使用され-a
ます-o
。しかし、いつでも行うことができます[ test1 ] && [ test2 ] || [ test3 ]
。これはbash
通常のブール演算子に結合された3つのテスト呼び出しです(つまり、最初の呼び出しが失敗した場合は2番目の呼び出しをスキップします)。
それでもbash
独自の[
(組み込み)実装が提供されますが、構文の処理方法は変わりません。
[[ ]]
(( ))
コマンドの組み込み置換ではなく特殊構文の一部であるため、他の規則が適用されます。変数名ワイルドカードの処理方法の詳細については、マニュアルページを参照してください。ブール演算子&&
は||
一般的な意味を持ちます。
1つ[[ ]]
は文字列中心です。すべての比較は文字列に基づいています(ただし、プラットフォームによって異なりますが、[
よりも「現代的」であり、ロケールをよりよく認識しますtest
)。また、ファイルテスト、正規表現などを処理します。
(( ))
算術式に使用されます。変数名は$
そこにある必要はなく、通常は比較(数字)を含む数学式を作成できます。この場合の比較は他の算術式と変わらず、trueは1でfalseは0であり、条件式で(( x=y*(z>4) ))
使用すると0ではないことがtrueで、0がfalseです。結果を$(( ))
。
だから:
[[ ]]
文字列条件、パターンマッチング、ファイルテスト(( ))
算術式と条件[ ]
テスト注文する:ブール演算と比較演算子を処理するための特別な非標準構文
答え2
「条件式」は、test
[
or[[
コマンドが内部的に使用するものです。
したがって、質問1と2は同じ意味です。
- 条件式に使用できますか? :できる。
- テストコマンドに使用できますか? :はい。
しかし、これはあなたが思うものとは異なります。
$ if [[ 1 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ 10 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ e < è ]]; then echo yes; else echo no; fi
yes
マニュアルによると、この比較は次のようになります。
True if string1 sorts before string2 lexicographically.
つまり、辞書式で(LC_COLLATE変数の影響を受けます)
簡単なテストは[
出力をファイルにリダイレクトします。
$ if [ e < è ]; then echo h; else echo b; fi
bash: è: No such file or directory
b
動作させるには、バックスラッシュ(引用符<および>)を使用する必要があります。
$ if [ e \< è ]; then echo h; else echo b; fi
h
ただし、<inを使用することはお勧めできませんtest
。
<、<=、>、>=を使用できる他の場所は、算術テストの内部、おそらくifテストの一部です。
$ if (( 12 <= 15 )); then echo "yes"; fi
yes
はい、これは次のとおりです。
$ if [[ 12 -le 15 ]]; then echo "yes"; fi
yes
次のように非常に似ています。
$ if [ 12 -le 15 ]; then echo "yes"; fi
yes
はい。それがすべてです。
<= >= < > comparison
== != equality and inequality
&& logical AND
|| logical OR
算術式に使用される条件式:
$ if (( ( ((2<3)&&(3>7)) * 18 ) == 0 )); then echo "yes"; fi
yes
これはコマンドの条件式とは異なりますtest
。