Bash:double equals vs -eq

bashで整数比較を行っています(ユーザーがrootとして実行されているかどうかを確認しようとしています)が、2つの異なるものが見つかりました方法:

二重に等しい:

if [ $UID == 0 ] then fi 

-eq

if [ $UID -eq 0 ] then fi 

bashには> =または< =がなく、-geと-leのみがあることを理解しています。なぜ、 if there “sa -eq

両側の比較方法に違いはありますか?

コメント

  • 括弧内にスペースが必要であることに注意してください:[ $UID -eq 0 ][ $UID -eq 0]ではありません。

回答

==bash固有の=のエイリアス。これは、-eqの数値比較の代わりに文字列(字句)比較を実行します。 (これはPerlから逆方向です。ワードスタイルの演算子は数値であり、シンボリック演算子は字句です。)

コメント

  • つまり、両側は整数であり、両側を文字列に変換してから比較しますか?
  • より正確には'逆に、すべてが文字列です。-eqbashに文字列を整数として解釈するように指示します(文字列の場合は警告なしで0を生成しますisn ' t数値)。
  • @tjameson例を挙げます:[ 01 -eq 1 ]ただし、[ 01 != 1 ]
  • ==[演算子として非標準であり、使用されません。 bash固有ではありません。kshによって導入され、zshでもサポートされています(ただし、最初の=は引用符で囲む必要があります) 、yashおよびGNU [ユーティリティ(少なくとも一部のシステムではkshスクリプトとして実装されているそのようなユーティリティ)。
  • @geekosaur文字列が'でない場合、bashv4.3.42から警告が表示されます。 t数値:$ if [ "hello" -eq 0 ]; then echo true; fi bash:[:hello:整数式が必要です

回答

または<=比較演算子。ただし、これらを((...))算術コマンドで使用して整数を比較することもできます。

他の文字列比較演算子(==!=<>、ただし=((...))内で整数を使用する場合に整数を比較します。

  • [[ 01 -eq 1 ]](( 01 == 1 ))はどちらも整数を実行します比較。どちらも当てはまります。
  • [[ 01 == 1 ]][ 01 = 1 ]はどちらも文字列の比較を行います。どちらもfalseです。
  • (( 01 -eq 1 ))(( 01 = 1 ))の両方でエラーが返されます。

注:二重括弧構文[[...]]および二重括弧構文((...))はすべてのシェルでサポートされているわけではありません。

コメント

  • 注意(mksh / zshを除く)( POSIXモードでは(ただし、'はPOSIX機能ではありません)))、iv id = “ce19a29e83″であるため、(( 010 == 10 ))はfalseを返します。 >

は8進数(10進数で8)として扱われます。

  • ほとんどのtest / [実装には' >= / <=演算子(yash ' s [は)、exprそのような演算子がありますが、それはarを行います引数が数値として認識される場合の算術比較(expr 01 '>=' 1はtrueを返し、expr X01 '>=' X1はfalseを返します)。
  • 回答

    整数比較を行う場合は、(())を使用することをお勧めします。ここで、> =なども使用できます。

    例:

    if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi 

    コメント

    • または(( UID == 0 ))または(( ! UID ))が重要です。 ((...))は非標準であることに注意してください(ksh機能はbashおよびzshバリエーションあり)

    コメントを残す

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