算術または条件式に<=、>=、<、>、==、!=、&&、||を使用しますか?

算術または条件式に<=、>=、<、>、==、!=、&&、||を使用しますか?

Bashのマニュアルでは、セクション6.5 Shell Arithmeticは次のように述べています。

<= >= < > comparison
== != equality and inequality 

&& logical AND
|| logical OR

その意味は条件式に使われるという意味のようです。ただし、算術式セクションには表示されます。

  1. その後、以下で使用できます。条件式

    <=,>=,<,>,==,!=セクション 6.4 には、算術式に似た条件式の演算子がすでにあります。

    arg1はarg2で動作します。

    OP は、「-eq」、「-ne」、「-lt」、「-le」、「-gt」、または「-ge」のいずれかです。これらの算術バイナリ演算子は、arg1がそれぞれarg2と等しい、等しくない、小さい、小さい、等しい、大きい、大きい、または等しい場合はtrueを返します。 Arg1 と arg2 は正または負のいずれかです。

    算術式の合計に似た条件式の演算子もすでにあります&&||

    • -a-oについてtest[...]
    • &&そして||[[...]]

    さて、条件式の演算子を導入しましたが、なぜ算術式に同様の演算子を導入するのですか?

  2. それらは次のために使用することができますテストコマンド

    私たちは、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です。結果を$(( ))

だから:

  • [[ ]]文字列条件、パターンマッチング、ファイルテスト
  • (( ))算術式と条件
  • [ ]テスト注文する:ブール演算と比較演算子を処理するための特別な非標準構文

おすすめ記事