bashで整数比較を行っています(ユーザーがrootとして実行されているかどうかを確認しようとしています)が、2つの異なるものが見つかりました方法:
二重に等しい:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
bashには> =または< =がなく、-geと-leのみがあることを理解しています。なぜ、 if there “sa -eq
?
両側の比較方法に違いはありますか?
コメント
回答
==
はbash
固有の=
のエイリアス。これは、-eq
の数値比較の代わりに文字列(字句)比較を実行します。 (これはPerlから逆方向です。ワードスタイルの演算子は数値であり、シンボリック演算子は字句です。)
コメント
- つまり、両側は整数であり、両側を文字列に変換してから比較しますか?
- より正確には'逆に、すべてが文字列です。
-eq
はbash
に文字列を整数として解釈するように指示します(文字列の場合は警告なしで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
バリエーションあり)
[ $UID -eq 0 ]
、[ $UID -eq 0]
ではありません。