쉘 비교에서 단일 및 이중 등호 (=)의 차이점은 무엇입니까?


28

내부의 문자열을 비교 if하려면 이중 대괄호를 사용해야합니다. 일부 책에서는 비교를 통해 수행 할 수 있다고 말합니다 =. 그러나 그것은 또한 작동합니다 ==.

#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
    echo "equal"
fi

비교할 때 ===비교할 때 차이가 있습니까?


4
여기 어딘가에 질문이 있습니까? 그렇다면 보이지 않습니다. =입니다 [. ==입니다 [[.
Chris Down

@ChrisDown 그것은 사실이 아닙니다.
xdavidliu

@xdavidliu 정교한 관리가 필요하십니까? 그것은 확실히 이다 전혀 이해가없는 POSIX에 따라 실제 ==사용되어야하는 이유이다, =와 (평등) [==함께 (인용 인식하는 의미로, 패턴 매칭을) [[. help testvs 참조 help [[.
Chris Down

@ChrisDown 아마도 "is"의 의미를 오해하고있을 것입니다. 수단 "을위한"경우 "에만 작동"후 주석 이후, 사실이 아니다 [ foo == foo ] && echo foo확실히 인쇄 foo있음을 나타냅니다 ==와 작품 [. 그러나, "있다"는 "과 함께 사용되었다"는 의미라면, 나는 이의가 적다.
xdavidliu

답변:


28

[[ $a == $b ]]비교가 아니라 패턴 일치입니다. [[ $a == "$b" ]]바이트 간 동등 비교 가 필요 합니다. =와 같다==를 지원하는 모든 쉘에서 합니다 [[...]](에서 소개 ksh)

[[...]]표준 sh구문 이 아닙니다 . 이 [ 명령 은 표준이며 표준 비교 연산자가 있습니다 =(일부 [구현에서도 인식 ==).

모든 명령에 대한 인수와 마찬가지로 변수도 따옴표로 묶어야합니다.

[ "$a" = "$b" ]

표준 sh에서 패턴 일치는 다음과 case같이 수행됩니다 .

case $a in
  ($b) ...
esac

완전성을 위해 쉘 스크립트에서 다른 평등 유사 연산자를 사용할 수 있습니다.

  • [ "$a" -eq "$b" ]: [십진 정수를 비교하는 표준 연산자. 일부 [구현은 숫자 주위에 공백을 허용하고 일부 구현은 임의의 산술 표현식을 허용하지만 이식성이 없습니다. 아마도 그것을 [ "$((a))" -eq "$((b))" ]위해 사용할 수 있습니다 . 다음 [ "$((a == b))" -ne 0 ]과 같은 표준에 해당되는 것을 참조하십시오 (POSIXly를 제외하고 동작은 정수 상수를 포함 $a하고 $b포함하는 경우에만 지정됨 ).
  • ((a == b))ksh에서이고 또한 zshand bash에서 발견되며 , 저장된 산술 표현식의 평가 $a에서와 동일한 수를 산출하면 true를 리턴합니다.$b . 일반적으로 숫자를 비교하는 데 사용됩니다. 산술 표현식을 평가하는 방법과 지원되는 숫자 (예 : bash 및 ksh의 일부 구현 / 버전은 부동 소수점을 지원하지 않거나 선행 0이있는 숫자를 8 진수로 처리하지 않음)에 대해 셸간에 차이가 있습니다.

  • expr "$a" = "$b"두 피연산자가 모두 10 진수 정수로 인식되면 (숫자 주위에 공백을 허용하는 경우) 숫자 비교를 수행하고 그렇지 않으면 두 문자열 연산자의 정렬 순서가 동일한 지 확인합니다. 또한의 값 실패 $a또는 $b그는 expr같은 통신 사업자 (,substr ...

  • awk 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b": $a$b숫자로 인식되는 경우 (최소 10 진수 정수 및 1.2, -1.5e-4와 같은 부동 소수점 숫자, 선행 공백은 무시되고 일부는 16 진수, 8 진 또는로 인식되는 strtod()숫자)로 인식 되면 숫자 비교가 수행됩니다. 그렇지 않으면, 구현에 따라,이 두 바이트로 바이트 문자열 비교, 또는에 대한 같은 비교, 즉 여부 와exprstrcoll()$a$b 종류 같은.

참조 :


13

이것은 bash와 동일합니다.

[[ $x == "$y" ]]
[[ $x = "$y" ]]
[ "$x" == "$y" ]
[ "$x" = "$y" ]

처음 두 개의 $ x 변수는 인용 할 필요가 없습니다. Bash는 [내부에서 단어 분리 및 경로 이름 확장을 수행하지만 [[:

$ x='a b'
$ [ -s $x ]
-bash: [: a: binary operator expected
$ [[ -s $x ]]
$ ls
$ [ a = * ]
-bash: [: a: unary operator expected
$ [[ a = * ]]
$ 

[[ $x = "$y" ]]문자열 비교이지만 [[ $x = $y ]]패턴 일치 표현식입니다.

$ y='a*'; [[ aa = "$y" ]]; echo $?
1
$ y='a*'; [[ aa = $y ]]; echo $?
0

-eq는 정수와 함께 사용해야합니다.

$ [[ x.x -eq x.x ]]
-bash: [[: x.x: syntax error: invalid arithmetic operator (error token is ".x")
$ x=9; [[ "x" -eq 9 ]]; echo $?
0

참조 : [[테스트 차이점은 무엇이며, [와 : BashFAQ / 031은? .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.