배쉬 : double equals vs -eq


47

bash에서 정수 비교를 수행하고 (사용자가 루트로 실행 중인지 확인하려고 시도) 두 가지 방법을 찾았습니다.

이중은 다음과 같습니다.

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

나는 결코 또는 <bash는 만 -ge 및 -le, 그래서 왜 =이있다 =>이 없다는 것을 이해 ==이 있다면 -eq?

양쪽을 비교하는 방식에 차이가 있습니까?


3
괄호 안의 공간이 필요합니다 : [ $UID -eq 0 ]하지 [ $UID -eq 0].
Gilles 'SO- 악한 중지'

답변:


50

==bash특정 별칭으로 =, -eq숫자 비교 대신 문자열 (어휘) 비교를 수행합니다 . (Perl과 거꾸로되어 있습니다. 단어 스타일 연산자는 숫자이고 어휘는 어휘입니다.)


그것은 양쪽이 정수이면 양쪽을 문자열로 변환 한 다음 비교하는 것을 의미합니까?
beatgammit

5
더 정확하게는 다른 방법입니다. 모든 것이 문자열이며 문자열을 정수로 해석하도록 -eq지시 bash합니다 ( 0문자열이 숫자가 아닌 경우 경고없이 생성 ).
geekosaur

11
@tjameson는 예제를 제공합니다 : [ 01 -eq 1 ]하지만 [ 01 != 1 ].
Gilles 'SO- 악한 중지'

3
반면 유의 ==A와 [조작자가 비표준이고, 사용되지 않으며, 그렇지 않은 Bash 전용 . 그것은 ksh에 의해 도입되었으며 zsh (첫 번째 =인용해야 함), yash 및 GNU [유틸리티 (및 일부 시스템에서 ksh 스크립트로 구현 된 유틸리티)에서 지원됩니다.
Stéphane Chazelas 2016 년

@geekosaur 내 문자열이 숫자가 아닌 경우 bash v4.3.42에서 경고가 표시됩니다. $ if [ "hello" -eq 0 ]; then echo true; fi bash : [: hello : integer expression expected
Andrew Bainbridge

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합니다.
Stéphane Chazelas 2016 년

대부분의 동안 참고 test/ [구현하지 않아도 >=/ <=(사업자 yash의가 [, 비록이) expr인수가 숫자로 인식하는 경우가 산술 비교를 할 것입니다하지만, 이러한 연산자를 가지고 ( expr 01 '>=' 1true를 반환하고, expr X01 '>=' X1false를 돌려줍니다).
Stéphane Chazelas 2016 년

7

정수 비교를 원하면 (=) 등을 사용할 수있는 (())를 사용하는 것이 좋습니다.

예:

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

아니면 (( UID == 0 ))(( ! UID ))에 대한 그 문제. 즉 주 ((...))비표준 (a이고 ksh또한 지원 특징 bashzsh변형을).
Stéphane Chazelas 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.