셸 동일 연산자(=, ==, -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
그==
단일 또는 이중 대괄호(또는test
command)는 문자열 비교 연산자 중 하나입니다.
$ [[ "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
그리고.0
Bash가 단지 문자열이라고 생각하는 경우:
$ [[ "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
'programing' 카테고리의 다른 글
Bash를 사용하여 파일에 특정 문자열이 포함되어 있는지 확인하는 방법 (0) | 2023.05.10 |
---|---|
Powershell ISE 내의 다른 PS1 스크립트에서 PowerShell 스크립트 PS1 호출 (0) | 2023.05.10 |
Serilog - 로그 항목이 호출된 MethodName을 사용하여 모든 메시지 출력/리치 (0) | 2023.05.10 |
웹 작업의 App.config가 아닌 Azure Management Portal에서 웹 작업에 대한 연결 문자열을 구성해야 하는 이유는 무엇입니까? (0) | 2023.05.10 |
PostgreSQL IF 문 (0) | 2023.05.10 |