조건식에서 "=="와 "="의 차이점은 무엇입니까?

조건식에서 "=="와 "="의 차이점은 무엇입니까?

bash 매뉴얼에서 조건식의 경우

string1 == string2
string1 = string2

문자열이 같으면 참입니다.

  1. 이 명령과 함께 사용하면 [[위에서 설명한 대로 패턴 일치를 수행합니다(10 페이지의 3.2.4.2 섹션 [조건부 구조] 참조).

    • 여기서 "패턴 일치"란 무엇을 의미합니까?

    • 여기서 "패턴 매칭"은 무엇에 해당합니까?

    • [["this"를 다른 명령이 아닌 다른 명령과 함께 사용하면 어떻게 되나요?

  2. test'='는 posix 일관성을 위한 명령과 함께 사용해야 합니다 .

    • POSIX는 여기서 무엇을 말합니까?

    • 이의제기문은 무엇인가요?

    • 명령을 ==사용할 수 있나요 ? test나는 그것을 시도했고 그렇습니다.

    • 이 명령어 외에 =다른 명령어와 함께 사용할 수 있나요 test? 시도해 보았는데 =효과가 있는 것 같습니다.[[[

  3. ==이들그리고 의 차이점은 무엇인가요 =?

    Bash 4.3에서는 , 및 와 함께 ==and 를 사용해 보았습니다 . 제가 보기엔 똑같은 것 같아요 .=test[[[===

    조건식에서 서로 바꿔서 사용할 수 있나요 ==?=

감사해요.

답변1

POSIXtest(또는 [ ... ])은 하나의 등호만 알고 있습니다.

s1= s2는
문자열 s1과 s2가 동일하면 참이고, 그렇지 않으면 거짓입니다.

그러나 Bash는 이중 등호도 허용하지만 내장 도움말에서는 이를 인정하지 않습니다(수동하다):

$ help test | grep -A1 =
  STRING1 = STRING2
                 True if the strings are equal.
  STRING1 != STRING2
                 True if the strings are not equal.

다른 껍질은 상황에 따라 다릅니다. 음, 특히 Dash는 여기서 가장 완고한 사람입니다.

$ dash -c '[ x == x ] && echo foo'
dash: 1: [: x: unexpected operator

하지만

$ yash -c '[ x == x ] && echo foo'
foo
$ busybox sh -c '[ x == x ] && echo foo'
foo
$ ksh93 -c '[ x == x ] && echo foo'
foo

가운데 zsh,=something 하나입니다파일 이름 확장자something연산자는 에 있는 경우 해당 옵션이 꺼져 있지 않는 한(예: 다른 쉘을 에뮬레이션하는 경우) 명령의 경로로 확장되며 $PATH간단한 명령에 대한 인수에 또는 적용되는 경우에도 적용됩니다. 예를 들어 최소한 선행 명령을 인용해야 합니다. :equals===~test[=

$ zsh -c 'echo =ls'
/usr/bin/ls

$ zsh +o equals -c 'echo =ls'
=ls

$ zsh --emulate ksh -c 'echo =ls'
=ls

$ zsh -c '[ x == x ] && echo foo'
zsh:1: = not found

$ zsh -c '[ x "==" x ] && echo foo'
foo

내 Debian에서 GNU coreutils에 대한 외부 test/util 지원 (그러나[==수동이를 인정하지 않습니다. OS X에서는 그렇지 않습니다.

따라서 test/ 를 사용할 때는 더 폭넓게 지원되므로 [ .. ]사용하시기 바랍니다 .=


와 함께[[ ... ]]구조, 및 는 =모두 ==동일하며(적어도 Bash에서는) 연산자의 오른쪽은 인용되지 않는 한 파일 이름 glob과 마찬가지로 패턴으로 처리됩니다. (파일명은 내부적으로 확장되지 않습니다 [[ ... ]].)

$ bash -c '[[ xxx == x* ]] && echo foo'
foo

그러나 물론 이 구성은 표준이 아닙니다.

$ dash -c '[[ xxx == x* ]] && echo foo'
dash: 1: [[: not found
$ yash -c '[[ xx == x* ]] && echo foo'
yash: no such command ‘[[’

Busybox에는 있지만 패턴 일치를 수행하지 않습니다.

$ busybox sh -c '[[ xx == xx ]] && echo yes || echo no'
yes
$ busybox sh -c '[[ xx == x* ]] && echo yes || echo no'
no

답변2

Bash에는 동등성을 위한 네 가지 조건이 있습니다.

  • =내부적으로(또는 테스트됨) 단순하고 기본적(posix 호환만 가능) [ … ]:
    두 문자열의 동등성(바이트 단위)만 수행합니다.

     STRING1 = STRING2
                 True if the strings are equal.
    
  • 이것확장하다 ==. 여전히 (만) 동일성 테스트를 수행합니다.

    $ [ aaaa == aaaa ] && echo yes
    yes
    
    $ [ aaaa == a* ] && echo yes
    $
    

    비밀번호에 일치하는 파일 이름이 있으면 a*따옴표가 없는 내용이 하나 이상의 파일 이름으로 확장됩니다. 특히 aaaa라는 기존 파일로 인해 코드가 yes로 출력됩니다. 일치하는 파일이 없으면 failedglob 및 nullglob 셸 옵션의 영향을 받아 정확한 비교가 이루어집니다.

  • =a 내의 A는 다음 [[과 정확히 동일합니다.

  • ==a 내부의 A는 [[바이트별 일치와 전역 일치를 모두 수행합니다.

    오른쪽의 문자열이나 변수를 ==참조하면 바이트 비교가 수행됩니다. 모든 바이트가 동일하면 결과는 [["양호"(0)입니다.

    문자열(또는 모든 경우에 바람직하게는 변수)이 인용되지 않은 경우 파일 이름 glob에서와 같이 일치가 수행됩니다.

    $ [[ aaaa == "aaaa" ]] && echo yes
    yes
    
    $ a='aaaa'
    $ [[ aaaa == "$a" ]] && echo yes
    yes
    
    $ a='a*'
    $ [[ aaaa == "$a" ]] && echo yes
    $
    
    $ a='a*'
    $ [[ aaaa == $a ]] && echo yes
    yes
    

흥미롭게도 인용되지 않은 내용 aaaa도 작동합니다.

$ a='aaaa'
$ [[ aaaa = $a ]] && echo yes
yes

이는 변수 내부의 문자열에 확장 가능한 전역 문자 *, +, 및 확장된(활성화된 경우) 및 ?가 없기 때문에 발생합니다 . 그러나 이는 종종 위험한 선택이다.[|@!

관련 정보