bash 매뉴얼에서 조건식의 경우
string1 == string2 string1 = string2
문자열이 같으면 참입니다.
이 명령과 함께 사용하면
[[
위에서 설명한 대로 패턴 일치를 수행합니다(10 페이지의 3.2.4.2 섹션 [조건부 구조] 참조).여기서 "패턴 일치"란 무엇을 의미합니까?
여기서 "패턴 매칭"은 무엇에 해당합니까?
[[
"this"를 다른 명령이 아닌 다른 명령과 함께 사용하면 어떻게 되나요?
test
'='는 posix 일관성을 위한 명령과 함께 사용해야 합니다 .POSIX는 여기서 무엇을 말합니까?
이의제기문은 무엇인가요?
명령을
==
사용할 수 있나요 ?test
나는 그것을 시도했고 그렇습니다.이 명령어 외에
=
다른 명령어와 함께 사용할 수 있나요test
? 시도해 보았는데=
효과가 있는 것 같습니다.[[
[
==
이들그리고 의 차이점은 무엇인가요=
?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
이는 변수 내부의 문자열에 확장 가능한 전역 문자 *
, +
, 및 확장된(활성화된 경우) 및 ?
가 없기 때문에 발생합니다 . 그러나 이는 종종 위험한 선택이다.[
|
@
!