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

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

내부 문자열을 비교하려면 if이중 대괄호를 사용해야 한다는 점을 읽어 보십시오. 어떤 책에서는 를 통해 비교할 수 있다고 말합니다 =. 그러나 이는 ==에도 적용됩니다.

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

=비교해 보면 별 차이가 없나요 ==?

답변1

bash( 해당 구문을 복사한 ksh곳 과 마찬가지로) 비교가 아니라 패턴 일치입니다. 바이트 간 동등 비교를 수행 해야 합니다 . 어떤 지원 으로도 .bash[[ $a == $b ]][[ $a == "$b" ]]===[[...]]

[[...]]표준 구문이 아닙니다 sh. 이것[ 주문하다표준이고 표준이다비교하다연산자가 존재합니다 =(일부 [구현에서는 1도 인식 하지만 ==).

모든 명령의 인수와 마찬가지로 변수 확장도 따옴표로 묶어야 합니다.분할+전역빈 삭제(후자만 에서 수행됨 zsh)이므로 다음과 같습니다.

[ "$a" = "$b" ]

표준에서는 sh패턴 일치가 다음과 같은 방식으로 수행됩니다 case.

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

완전성을 위해 다른평등하다쉘 스크립트에서 만날 수 있는 연산자:

  • [ "$a" -eq "$b" ]: [십진 정수를 비교하기 위한 표준 연산자입니다. 일부 [구현에서는 숫자 주위에 공백을 허용하고 일부에서는 임의의 산술 표현식을 허용하지만 이는 이식 가능하지 않습니다. 휴대용으로 사람들이 사용할 수 있습니다 [ "$(($a))" -eq "$(($b))" ]. [ "$((a == b))" -ne 0 ]다음과 같은 표준 항목 도 참조하세요 (정수 상수가 포함 $a된 경우에만 동작을 지정하는 POSIXly 제외 $b).

  • ((a == b))zsh및 에도 있는 ksh의 는 bash에 저장된 산술 표현식이 $a와 동일한 결과로 평가되는 경우 true를 반환합니다 $b. 일반적으로 숫자를 비교하는 데 사용됩니다. 산술 표현식을 평가하는 방법과 지원되는 숫자에는 쉘 간에 차이가 있습니다(예: bash 및 ksh의 일부 구현/버전은 부동 소수점을 지원하지 않거나 앞에 0이 있는 숫자를 8진수로 처리하지 않습니다).

  • expr "$a" = "$b"두 피연산자가 모두 10진수 정수로 인식되면(일부는 숫자 주위에 공백을 허용함) 숫자 비교가 수행되고, 그렇지 않으면 두 문자열 피연산자의 정렬 순서가 동일한지 확인됩니다. $aOR $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

또한보십시오:


[1 GNU 및 의 내장 기능을 포함합니다 . [비록 모두 쉘 및 을 기반으로 한 것은 아니지만,kshbashyashashzshzsh=cmd특수 파일 이름 확장 연산자입니다.(동일한 맥락에서 확장됨 )은 해당 명령의 경로로 확장되므로 해당 기능을 비활성화하는 옵션을 ~user끄지 않는 한 이를 작성해야 합니다. 그렇지 않으면 명령을 찾을 수 없다는 오류가 발생합니다 . 다음에도 적용됩니다.equals[ "$a" '==' "$b" ]=[ "$string" '=~' "$regexp" ]

답변2

이는 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: test, [ 및 [[의 차이점은 무엇입니까?.

답변3

=다 운영자입니다 ==. 일부 언어(C 등)에서는 하나는 변수에 값을 할당하는 데 사용되고 다른 하나는 값(산술 표현식의 결과)을 비교하는 데 사용됩니다. 실제로 이 두 연산자는 산술 평가에 사용되는 연산자와 정확히 동일합니다. A $((a=23))는 할당이고, a $((a==23))는 산술 비교입니다.

$ echo "$((a=11)) $((a==23))" "$((a=23))" "$((a==23))"
11 0 23 1

하지만 테스트 구조 내부에서는(모두시험그리고[…]그리고[[...]]) 두 연산자 모두 동일한 의미를 가지며 동일한 작업을 수행합니다.

따라서 모든 옵션은 다음과 같습니다.

test "$a" =  "$b"
   [ "$a" =  "$b" ]
  [[ "$a" =  "$b" ]]
test "$a" == "$b"
   [ "$a" == "$b" ]
  [[ "$a" == "$b" ]]

내부 등가물세게 때리다이진 동일성(참조된 변수)을 테스트합니다. 올바른 변수가 인용되지 않은 경우 패턴으로 해석되어 그에 따라 일치될 수 있습니다. 즉, 리터럴 문자열이 아닌 패턴으로 일치될 수 있습니다.

인용된 연산자 \=및 는 \==test 및 에서 사용될 때에도 동일합니다 […]. 그러나 인용된 연산자는 \==내부적으로 실패합니다 [[…]].

다른 셸의 경우 결과는 다양합니다. 올바른 결과는 Y -(true false)여야 하며, 0(true) 및 1(false)과 다른 종료 코드는 failures 로 보고됩니다 ¤. 일부 쉘은 실패합니다 - -(종료 코드는 항상 1입니다).

                     | dash  ksh   bash  zsh   
  test a  =  "$b"    | Y -   Y -   Y -   Y -    
     [ a  =  "$b" ]  | Y -   Y -   Y -   Y -    
    [[ a  =  "$b" ]] | ¤ ¤   Y -   Y -   Y -    
  test a  == "$b"    | ¤ ¤   Y -   Y -   - -    
     [ a  == "$b" ]  | ¤ ¤   Y -   Y -   - -    
    [[ a  == "$b" ]] | ¤ ¤   Y -   Y -   Y -    
  test a \=  "$b"    | Y -   Y -   Y -   Y -    
     [ a \=  "$b" ]  | Y -   Y -   Y -   Y -    
    [[ a \=  "$b" ]] | ¤ ¤   Y -   - -   - -    
  test a \== "$b"    | ¤ ¤   Y -   Y -   Y -    
     [ a \== "$b" ]  | ¤ ¤   Y -   Y -   Y -    
    [[ a \== "$b" ]] | ¤ ¤   Y -   - -   - -

모든 옵션은 ksh에서 작동하고, 인용된 연산자는 [[…]]bash 및 zsh(내부적으로)에서 실패하고, 인용되지 않은 연산자는 zsh(외부적으로)에서 \=실패합니다 .\==[[…]]

관련 정보