내부 문자열을 비교하려면 if
이중 대괄호를 사용해야 한다는 점을 읽어 보십시오. 어떤 책에서는 를 통해 비교할 수 있다고 말합니다 =
. 그러나 이는 ==
에도 적용됩니다.
#!/bin/bash
a="hello"
b="world"
if [[ $a == $b ]];then
echo "equal"
fi
=
비교해 보면 별 차이가 없나요 ==
?
답변1
bash
( 해당 구문을 복사한 ksh
곳 과 마찬가지로) 비교가 아니라 패턴 일치입니다. 바이트 간 동등 비교를 수행 해야 합니다 . 어떤 지원 으로도 .bash
[[ $a == $b ]]
[[ $a == "$b" ]]
=
==
[[...]]
[[...]]
표준 구문이 아닙니다 sh
. 이것[
주문하다표준이고 표준이다비교하다연산자가 존재합니다 =
(일부 [
구현에서는 1도 인식 하지만 ==
).
모든 명령의 인수와 마찬가지로 변수 확장도 따옴표로 묶어야 합니다.분할+전역빈 삭제(후자만 에서 수행됨 zsh
)이므로 다음과 같습니다.
[ "$a" = "$b" ]
표준에서는 sh
패턴 일치가 다음과 같은 방식으로 수행됩니다 case
.
case $a in
($b) ...
esac
완전성을 위해 다른평등하다쉘 스크립트에서 만날 수 있는 연산자:
[ "$a" -eq "$b" ]
:[
십진 정수를 비교하기 위한 표준 연산자입니다. 일부[
구현에서는 숫자 주위에 공백을 허용하고 일부에서는 임의의 산술 표현식을 허용하지만 이는 이식 가능하지 않습니다. 휴대용으로 사람들이 사용할 수 있습니다[ "$(($a))" -eq "$(($b))" ]
.[ "$((a == b))" -ne 0 ]
다음과 같은 표준 항목 도 참조하세요 (정수 상수가 포함$a
된 경우에만 동작을 지정하는 POSIXly 제외$b
).((a == b))
zsh
및 에도 있는 ksh의 는bash
에 저장된 산술 표현식이$a
와 동일한 결과로 평가되는 경우 true를 반환합니다$b
. 일반적으로 숫자를 비교하는 데 사용됩니다. 산술 표현식을 평가하는 방법과 지원되는 숫자에는 쉘 간에 차이가 있습니다(예: bash 및 ksh의 일부 구현/버전은 부동 소수점을 지원하지 않거나 앞에 0이 있는 숫자를 8진수로 처리하지 않습니다).expr "$a" = "$b"
두 피연산자가 모두 10진수 정수로 인식되면(일부는 숫자 주위에 공백을 허용함) 숫자 비교가 수행되고, 그렇지 않으면 두 문자열 피연산자의 정렬 순서가 동일한지 확인됩니다.$a
OR$b
연산자 값 에도expr
실패 합니다(
...substr
awk -- 'BEGIN{exit !(ARGV[1] == ARGV[2])}' "$a" "$b"
$a
: 합계가 숫자로 인식$b
(최소 10진수 정수 및 1.2, -1.5e-4와 같은 부동 소수점, 선행 후행 공백은 무시되고 일부는 16진수, 8진수 또는 인식되는 모든 숫자도 인식함되면 비교 입니다 . 즉, 여부 와 정렬이 동일한지 여부입니다.strtod()
expr
strcoll()
$a
$b
또한보십시오:
[
1 GNU 및 의 내장 기능을 포함합니다 . [
비록 모두 쉘 및 을 기반으로 한 것은 아니지만,ksh
bash
yash
ash
zsh
zsh
=cmd
특수 파일 이름 확장 연산자입니다.(동일한 맥락에서 확장됨 )은 해당 명령의 경로로 확장되므로 해당 기능을 비활성화하는 옵션을 ~user
끄지 않는 한 이를 작성해야 합니다. 그렇지 않으면 명령을 찾을 수 없다는 오류가 발생합니다 . 다음에도 적용됩니다.equals
[ "$a" '==' "$b" ]
=
[ "$string" '=~' "$regexp" ]
답변2
이는 bash에서도 동일합니다:
[[ $x == "$y" ]]
[[ $x = "$y" ]]
[ "$x" == "$y" ]
[ "$x" = "$y" ]
처음 두 개의 $x 변수는 따옴표로 묶을 필요가 없습니다. Bash는 [ 내에서 토큰화 및 경로 이름 확장을 수행하지만 [[: 내에서는 수행하지 않습니다.
$ x='a b'
$ [ -s $x ]
-bash: [: a: binary operator expected
$ [[ -s $x ]]
$ ls
$ [ a = * ]
-bash: [: a: unary operator expected
$ [[ a = * ]]
$
[[ $x = "$y" ]]
문자열 비교이지만 [[ $x = $y ]]
패턴 일치 표현식은 다음과 같습니다.
$ y='a*'; [[ aa = "$y" ]]; echo $?
1
$ y='a*'; [[ aa = $y ]]; echo $?
0
-eq는 정수에서만 작동합니다.
$ [[ x.x -eq x.x ]]
-bash: [[: x.x: syntax error: invalid arithmetic operator (error token is ".x")
$ x=9; [[ "x" -eq 9 ]]; echo $?
0
당신은 또한 볼 수 있습니다BashFAQ/031: test, [ 및 [[의 차이점은 무엇입니까?.
답변3
둘 =
다 운영자입니다 ==
. 일부 언어(C 등)에서는 하나는 변수에 값을 할당하는 데 사용되고 다른 하나는 값(산술 표현식의 결과)을 비교하는 데 사용됩니다. 실제로 이 두 연산자는 산술 평가에 사용되는 연산자와 정확히 동일합니다. A $((a=23))
는 할당이고, a $((a==23))
는 산술 비교입니다.
$ echo "$((a=11)) $((a==23))" "$((a=23))" "$((a==23))"
11 0 23 1
하지만 테스트 구조 내부에서는(모두시험그리고[…]그리고[[...]]) 두 연산자 모두 동일한 의미를 가지며 동일한 작업을 수행합니다.
따라서 모든 옵션은 다음과 같습니다.
test "$a" = "$b"
[ "$a" = "$b" ]
[[ "$a" = "$b" ]]
test "$a" == "$b"
[ "$a" == "$b" ]
[[ "$a" == "$b" ]]
예내부 등가물세게 때리다이진 동일성(참조된 변수)을 테스트합니다. 올바른 변수가 인용되지 않은 경우 패턴으로 해석되어 그에 따라 일치될 수 있습니다. 즉, 리터럴 문자열이 아닌 패턴으로 일치될 수 있습니다.
인용된 연산자 \=
및 는 \==
test 및 에서 사용될 때에도 동일합니다 […]
. 그러나 인용된 연산자는 \==
내부적으로 실패합니다 [[…]]
.
다른 셸의 경우 결과는 다양합니다. 올바른 결과는 Y -
(true false)여야 하며, 0(true) 및 1(false)과 다른 종료 코드는 failures 로 보고됩니다 ¤
. 일부 쉘은 실패합니다 - -
(종료 코드는 항상 1입니다).
| dash ksh bash zsh
test a = "$b" | Y - Y - Y - Y -
[ a = "$b" ] | Y - Y - Y - Y -
[[ a = "$b" ]] | ¤ ¤ Y - Y - Y -
test a == "$b" | ¤ ¤ Y - Y - - -
[ a == "$b" ] | ¤ ¤ Y - Y - - -
[[ a == "$b" ]] | ¤ ¤ Y - Y - Y -
test a \= "$b" | Y - Y - Y - Y -
[ a \= "$b" ] | Y - Y - Y - Y -
[[ a \= "$b" ]] | ¤ ¤ Y - - - - -
test a \== "$b" | ¤ ¤ Y - Y - Y -
[ a \== "$b" ] | ¤ ¤ Y - Y - Y -
[[ a \== "$b" ]] | ¤ ¤ Y - - - - -
모든 옵션은 ksh에서 작동하고, 인용된 연산자는 [[…]]
bash 및 zsh(내부적으로)에서 실패하고, 인용되지 않은 연산자는 zsh(외부적으로)에서 \=
실패합니다 .\==
[[…]]