ㅏ

変数を逆参照するときは、記号を使用する必要がbashあります$。それにもかかわらず、次はうまくいくようです。

x=5
[[ x -gt 2 ]]

誰でもこれを説明できますか?

編集:(追加情報)

私の言葉は、[[]]コマンドが$記号なしで私の変数xを逆参照する方法と理由を意味します。はい、x = 1の場合、ステートメントはfalseと評価されます(状態1を返します)。

ベストアンサー1

その理由は、-eqパラメータの算術的評価を強制するためです。

算術演算子:-eq、、、-gtおよび内部的に(ksh、zsh、およびbashで)変数名はCのように自動的に拡張され、先行が必要ないことを-lt意味します。-ge-le-ne[[ ]]$

  • これを確認するには、bashソースコードを見てください。マニュアルには付属していません直接確認してください。

    算術演算子の処理はtest.c内部的にこの関数に属します。

    arithcomp (s, t, op, flags)
    

    ここで、とstすべてオペランドです。オペランドは関数に渡されます。

    l = evalexp (s, &expok);
    r = evalexp (t, &expok);
    

    この関数は、次のヘッダーを使用してevalexp内部で定義されます。expr.c

    /* expr.c -- arithmetic expression evaluation. */
    

    はい。算術演算子の両方が(直接的に)算術式の評価に属します。直接的で、しかし、ifはありません。


実際、:

 $ x=3

どちらも失敗します。

 $ [[ x = 4 ]] && echo yes || echo no
 no

 $ [[ x = 3 ]] && echo yes || echo no
 no

これは正確でx拡張されておらず、x数字と同じではありません。

しかし:

 $ [[ x -eq 3 ]] && echo yes || echo no
 yes

 $ [[ x -eq 4 ]] && echo yes || echo no
 no

名前付き変数はx拡張されます($なしでも)。

これはzshやbashでは発生しません[…](kshでは発生します)。


これは内部で発生するのと同じことです$((…))

 $ echo $(( x + 7 ))
 10

そしてこれは(非常に)再帰的であることを理解してください(ダッシュとヤッシュを除く)。

 $ a=b b=c c=d d=e e=f f=3
 $ echo "$(( a + 7 ))" 
 10

おすすめ記事