programing

셸 동일 연산자(=, ==, -eq)

telecom 2023. 5. 10. 20:16
반응형

셸 동일 연산자(=, ==, -eq)

사이의 차이점은 무엇입니까?=,==그리고.-eq셸 스크립팅에서?

다음과 다른 점이 있습니까?

[ $a = $b ]
[ $a == $b ]
[ $a -eq $b ]

단순하게도=그리고.==변수에 숫자가 포함된 경우에만 사용됩니까?

=그리고.==문자열 비교를 위한 것입니다.
-eq수치 비교를 위한 것입니다.
-eq과 같은 과에 속함-lt,-le,-gt,-ge,그리고.-ne

==bash로 한정됩니다(sh(Bourne 셸)에는 없음).POSIX 사용=호환성을 위해 선호됩니다.bash에서는 둘이 같고, sh에서는 둘이 같습니다.=유일하게 작동할 것입니다.

$ a=foo
$ [ "$a" = foo ]; echo "$?"       # POSIX sh
0
$ [ "$a" == foo ]; echo "$?"      # bash-specific
0
$ [ "$a" -eq foo ]; echo "$?"     # wrong
-bash: [: foo: integer expression expected
2

(참고: 변수 확장을 인용해야 합니다.위의 이중 따옴표를 빠뜨리지 마십시오.)

만약 당신이 글을 쓰고 있는 경우#!/bin/bash스크립트를 작성한 후 대신 사용하는 것이 좋습니다.두 개의 사각형 브래킷[[...]]폼에는 더 많은 기능, 더 자연스러운 구문 및 더 적은 수의 gotch가 있습니다.예를 들어, 큰따옴표는 더 이상 필요하지 않습니다.$a:

$ [[ $a == foo ]]; echo "$?"      # bash-specific
0

참고 항목:

측정 시스템 주변의 테스트 구성에 따라 다릅니다.두 개의 괄호, 두 개의 괄호, 단일 괄호를 사용할 수 있습니다.

))을 사용하면 다음과 같은 산술적 동일성을 검정하는 것입니다.==C에서와 같이:

$ (( 1==1 )); echo $?
0
$ (( 1==2 )); echo $?
1

(참고:0수단true유닉스 의미에서, 그리고 실패한 테스트는 0이 아닌 숫자로 귀결됩니다.)

사용.-eq이중 괄호 안에 구문 오류가 있습니다.

…(]]또는 단일 대괄호) 또는 …(또는 이중 대괄호)을 ]사용하는 경우, 또는test다음 중 하나를 사용할 수 있습니다.-eq,-ne,-lt,-le,-gt또는-ge산술적 비교로서

$ [ 1 -eq 1 ]; echo $?
0
$ [ 1 -eq 2 ]; echo $?
1
$ test 1 -eq 1; echo $?
0

==단일 또는 이중 대괄호(또는testcommand)는 문자열 비교 연산자 중 하나입니다.

$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1

문자열 연산자로서,=와 동등합니다.==또한 주변의 공백을 메모합니다.=또는==필수입니다.

당신이 할 수 있는 한[[ 1 == 1 ]]또는[[ $(( 1+1 )) == 2 ]]산술적 동일성이 아닌 문자열 동일성을 테스트하는 것입니다.

그렇게-eq의 정수 값이 예상되는 결과를 생성합니다.1+1와 같음2오른쪽이 문자열이고 후행 공백이 있더라도:

$ [[ $(( 1+1 )) -eq  "2 " ]]; echo $?
0

동일한 문자열 비교가 후행 공간을 선택하는 동안 문자열 비교가 실패합니다.

$ [[ $(( 1+1 )) == "2 " ]]; echo $?
1

그리고 잘못된 문자열 비교는 완전히 잘못된 답을 만들어 낼 수 있습니다. 10사전 통계적으로 다음보다 작습니다.2그래서 문자열 비교가 반환됩니다.true또는0많은 사람들이 이 벌레에 물렸습니다.

$ [[ 10 < 2 ]]; echo $?
0

테올트스른에 대한 10다음보다 산술적으로 작음2다음과 같습니다.

$ [[ 10 -lt 2 ]]; echo $?
1

댓글에는 정수를 사용하는 기술적 이유에 대한 질문이 있습니다.-eq합니다. on strings는 true를 반환합니다.

$ [[ "yes" -eq "no" ]]; echo $?
0

그 이유는 Bash는 타자기가 없기 때문입니다.-eq가능하면 기본 변환을 포함하여 문자열을 정수로 해석합니다.

$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0

그리고.0Bash가 단지 문자열이라고 생각하는 경우:

$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1

그렇게[[ "yes" -eq "no" ]]는 와동합다니등다에 합니다.[[ 0 -eq 0 ]]


마지막 노트:테스트 구성에 대한 Bash 관련 확장의 대부분은 POSIX가 아니므로 다른 셸에서 실패할 수 있습니다. 다른 셸은 일반적으로 및 또는지원하지 않습니다.

==는 bash 별대별칭다니입에의 입니다.=숫자 비교 대신 문자열(사전) 비교를 수행합니다. eq물론 숫자로 비교하는 것.

마지막으로, 저는 보통 그 형태를 사용하는 것을 선호합니다.if [ "$a" == "$b" ]

몇몇 대답들은 위험한 예들을 보여줍니다. OP 의예들면를,,[ $a == $b ]특별히 인용되지 않은 변수 대체 사용(2017년 10월 편집 기준).위해서[...]문자열 동일성에 대해 안전합니다.

하지만 만약 당신이 다음과 같은 대안들을 열거한다면.[[...]]또한 오른쪽을 따옴표로 묶어야 한다는 것을 알려주어야 합니다.따옴표를 붙이지 않으면 패턴 일치입니다! (Bashman 페이지에서 "패턴의 모든 부분을 따옴표로 묶어서 문자열로 만들 수 있습니다.")

여기서 Bash에서 "yes"를 산출하는 두 개의 문은 패턴 매칭이고, 나머지 세 개는 문자열 동일입니다.

$ rht="A*"
$ lft="AB"
$ [ $lft = $rht ] && echo yes
$ [ $lft == $rht ] && echo yes
$ [[ $lft = $rht ]] && echo yes
yes
$ [[ $lft == $rht ]] && echo yes
yes
$ [[ $lft == "$rht" ]] && echo yes
$

언급URL : https://stackoverflow.com/questions/20449543/shell-equality-operators-eq

반응형