Bash:ダブルイコールvs -eq


47

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

二重に等しい:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

私は> =または<bashで、唯一-geと-le、なぜそこにある=があることを理解していない==があるかどう-eq

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


3
括弧内のスペースが必要であることに注意してください:[ $UID -eq 0 ]ではなく[ $UID -eq 0]
ジル 'SO-悪であるのをやめる'

回答:


50

==であるbashため特異的エイリアス=の代わりに文字列(字句)比較行い、-eq数値比較を。(Perlから逆向きです:単語スタイルの演算子は数値であり、シンボリックなものはレキシカルです。)


つまり、両側が整数である場合、両側を文字列に変換してから比較しますか?
beatgammit

5
もっと正確に言えば、すべてが文字列であり、文字列を整数として解釈する-eqように指示bashします(0文字列が数値でない場合は警告なしに生成されます)。
ギーコサウルス

11
@tjameson例を挙げると:[ 01 -eq 1 ]but [ 01 != 1 ]です。
ジル 'SO-悪であるのをやめる'

3
ながらそのノート==として[、操作者が非標準であり、使用すべきではない、そうでないbashの固有。これはkshによって導入され、zsh(最初=に引用する必要がありますが)、yashおよびGNU [ユーティリティ(および一部のシステムでkshスクリプトとして実装されたそのようなユーティリティ)でもサポートされています。
ステファンシャゼル

@geekosaur文字列が数値でない場合、bash v4.3.42から警告が表示されます:$ if [ "hello" -eq 0 ]; then echo true; fi bash:[:hello:integer expression expected
アンドリューベインブリッジ

13

ボロバンの答えを詳しく説明するには...

何もありません>=か、<=文字列の比較演算子。しかし、((...))算術コマンドでそれらを使用して整数を比較することもできます。

また、(他の文字列比較演算子を使用することができ==!=<>、ではなく、=あなたが内側にそれらを使用する場合)の整数を比較します((...))

  • どちら[[ 01 -eq 1 ]](( 01 == 1 ))整数の比較を行います。両方とも真実です。
  • 両方[[ 01 == 1 ]][ 01 = 1 ]文字列比較を行います。どちらも偽です。
  • 両方(( 01 -eq 1 ))(( 01 = 1 ))エラーを返します。

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


1
mksh/ zshを除く(POSIXモードを除く(POSIX機能ではないが)))は、8進数(10進数で8)として扱われる(( 010 == 10 ))ためfalseを返すことに注意してください010
ステファンシャゼラス

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

7

整数比較を行いたい場合は、(=)を使用することをお勧めします。

例:

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

あるいは、(( UID == 0 ))または(( ! UID ))その事柄のために。注((...))非標準である(kshまたによってサポートされた機能bashおよびzshバリエーションで)。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.