배쉬 평등 연산자 (==, -eq)
누군가 가 bash 스크립팅 -eq
과 의 차이점을 설명해 주 ==
시겠습니까?
다음과 같은 차이점이 있습니까?
[ $a -eq $b ]
과 [ $a == $b ]
그것은 단순히 즉 ==
변수가 숫자가 포함되어있는 경우에만 사용됩니다?
다른 방법 ==
은 문자열 비교, -eq
숫자 비교 입니다. -eq
같은 가족이다 -lt
, -le
, -gt
, -ge
,와 -ne
, 그건 당신이 어떤을 어떤 기억하는 데 도움합니다.
$ [ a == a ]; echo $?
0
$ [ a -eq a ]; echo $?
-bash: [: a: integer expression expected
2
==
bash-ism입니다. POSIX 양식은 =
입니다. 비 -bash 쉘로의 이식성이 중요한 경우을 사용하십시오 =
.
==
은 bash 특정 별명이며 =
숫자 비교 대신 문자열 (어휘) 비교를 수행합니다. eq
물론 숫자 비교입니다.
마지막으로, 나는 일반적으로 양식을 사용하는 것을 선호합니다 if [ "$a" == "$b" ]
연산자 주위의 테스트 구성 에 따라 다릅니다 . 옵션은 이중 괄호, 이중 괄호, 단일 괄호 또는 테스트입니다.
당신이 사용하는 경우 ((...)) , 당신은 산술 지분을 테스트하는 ==
C에서와 같이 :
$ (( 1==1 )); echo $?
0
$ (( 1==2 )); echo $?
1
(참고 : 0
수단 true
유닉스 감각과 비 제로에 실패한 테스트입니다)
-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
명령) 의 내부 는 문자열 비교 연산자 중 하나입니다 .
$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1
문자열 연산자 는 공백 또는 필요한 공백과 =
같습니다 .==
=
==
당신은 동안 수 할 [[ 1 == 1 ]]
또는 [[ $(( 1+1 )) == 2 ]]
그 문자열 평등 시험하고있다 -하지 산술 평등을.
그래서 -eq
결과 생산 아마 의 정수 값 것으로 예상 1+1
IS가 동일 2
RH 문자열과 뒤에 공간이 비록를 :
$ [[ $(( 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
이 있습니다. 동일하지 않은 문자열에 대해서는 True를 반환합니다.
$ [[ "yes" -eq "no" ]]; echo $?
0
그 이유는 Bash가 형식화되지 않았기 때문 입니다. 는 -eq
문자열이 정수로 해석됩니다 가능하면 기본 변환을 포함 :
$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0
그리고 0
배쉬는 그냥 문자열입니다 생각하는 경우 :
$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1
그래서 [[ "yes" -eq "no" ]]
동일합니다[[ 0 -eq 0 ]]
Last note: Many of the Bash specific extensions to the Test Constructs are not POSIX and therefore will fail in other shells. Other shells generally do not support [[...]]
and ((...))
or ==
.
Guys: Several answers show dangerous examples. OP's example [ $a == $b ]
specifically used unquoted variable substitution (as of Oct '17 edit). For [...]
that is safe for string equality.
But if you're going to enumerate alternatives like [[...]]
, you must inform also that the right-hand-side must be quoted. If not quoted, it is a pattern match! (From bash man page: "Any part of the pattern may be quoted to force it to be matched as a string.").
Here in bash, the two statements yielding "yes" are pattern matching, other three are string equality:
$ 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/bash-equality-operators-eq
'Programming' 카테고리의 다른 글
파이썬 그룹 (0) | 2020.08.05 |
---|---|
테스트 목적으로 브라우저에서 CSS를 비활성화하는 방법 (0) | 2020.08.05 |
ES6 구문을 사용하여 jquery를 가져 오는 방법은 무엇입니까? (0) | 2020.08.05 |
Emacs로 SSH 및 Sudo를 통해 파일 열기 (0) | 2020.08.05 |
작곡가 삭제 변경 : [y, n, v, d, s ,?] (0) | 2020.08.05 |