Bash 매뉴얼에서 섹션 6.5 Shell Arithmetic은 다음과 같이 말합니다.
<= >= < > comparison
== != equality and inequality
&& logical AND
|| logical OR
그 의미는 조건식에 사용된다는 뜻인 것 같습니다. 그러나 산술 표현식 섹션에는 나타납니다.
그런 다음 다음에서 사용할 수 있습니다.조건식?
<=,>=,<,>,==,!=
섹션 6.4에는 산술 표현식과 유사한 조건 표현식에 대한 연산자가 이미 있습니다.arg1은 arg2에서 작동합니다.
OP는 "-eq", "-ne", "-lt", "-le", "-gt" 또는 "-ge" 중 하나입니다. 이러한 산술 이진 연산자는 arg1이 각각 arg2와 같거나, 같지 않거나, 작거나, 작거나 같거나, 크거나, 크거나 같은 경우 true를 반환합니다. Arg1 및 arg2는 양수 또는 음수일 수 있습니다.
산술식의 합과 유사한 조건식에 대한 연산자도 이미 있습니다
&&
.||
-a
그에-o
대한test
[...]
&&
그리고 .||
[[...]]
이제 조건식에 대한 연산자를 도입했는데 왜 산술 표현식에 유사한 연산자를 도입해야 합니까?
그들은 다음을 위해 사용될 수 있습니다테스트 명령?
우리는
if
다음이 테스트 명령이라는 것을 알고 있습니다.if 명령의 구문은 다음과 같습니다.
if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
[...]
둘 다[[...]]
조건식을 취하고 테스트 명령을 생성합니다. 산술식을 사용할 수 있나요?나를 더욱 혼란스럽게 하는 것은 그 안에 있는 산술
[...]
표현식이[[...]]
테스트 명령으로 사용될 때[...]
부정확하게 동작한다는 것입니다[[...]]
.$ if [ 1 > 2 ]; then echo h; else echo b; fi h $ if [ 1 < 2 ]; then echo h; else echo b; fi h $ if [[ 1 < 2 ]]; then echo h; else echo b; fi h $ if [[ 1 > 2 ]]; then echo h; else echo b; fi b
답변1
이것은 매우 간단합니다. 당신은 이해 []
하고 완전히 다른 짐승이 되어야 합니다 [[]]
.(())
[ expression ]
bash의 모든 명령 호출과 같이 표현식을 인수로 사용하여 프로그램을 호출하면 됩니다 [
(다른 이름 ). test
즉, 특히 after [
와 before 사이에 공백을 사용해야 하고 ]
, 키워드와 특수 문자는 이스케이프하거나 인용해야 하며, 변수는 일반적인 방식으로 확장되어야 합니다.
표현식에서 -gt, -lt
및 관련은 숫자 비교에 사용되고, >, <
정렬은 문자열 비교에 사용됩니다. [
이는 bash와는 아무런 관련이 없으며, 모든 프로그램처럼 0(true) 또는 0이 아닌(false)을 평가하고 반환하는 표현식을 호출하는 명령일 뿐이라고 생각할 수 있습니다 .
부울 연산자 &&
및 는 ||
bash에 의해 해석되고 인수로 전달되지 않기 때문에 사용할 수 없습니다 test
. 대신 사용 -a
됩니다 -o
. 하지만 언제든지 할 수 있습니다 [ test1 ] && [ test2 ] || [ test3 ]
. 이는 bash
일반적인 부울 연산자로 결합된 3개의 테스트 호출입니다(즉, 첫 번째 호출이 실패하면 두 번째 호출을 건너뜁니다).
여전히 bash
자체 [
(내장) 구현이 제공되지만 구문이 처리되는 방식은 변경되지 않습니다.
[[ ]]
(( ))
명령에 대한 기본 제공 대체가 아니라 특수 구문의 일부이므로 다른 규칙이 적용됩니다 . 변수 이름 와일드카드를 처리하는 방법에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오. 부울 연산자 &&
는 ||
일반적인 의미를 갖습니다.
하나 [[ ]]
는 문자열 중심입니다. 모든 비교는 문자열을 기준으로 합니다(그러나 플랫폼에 따라 [
다르지만 에서보다 더 "현대적"이고 로케일을 더 잘 인식합니다 test
). 또한 파일 테스트, 정규식 등을 처리합니다.
(( ))
산술 표현식 에 사용됩니다 . 변수 이름은 $
거기에 있을 필요가 없으며 일반적으로 비교(숫자)를 포함하여 수학적 표현식을 작성할 수 있습니다. 이 경우의 비교는 다른 산술식과 다르지 않으며, true는 1이고 false는 0이며, (( x=y*(z>4) ))
조건식에 사용하면 0이 아닌 것이 true이고 0이 false입니다. 결과를 $(( ))
.
그래서:
[[ ]]
문자열 조건, 패턴 일치 및 파일 테스트(( ))
산술 표현식 및 조건[ ]
시험주문하다: 부울 및 비교 연산자를 처리하기 위한 특수 비표준 구문
답변2
"조건식"은 test
[
or [[
명령이 내부적으로 사용하는 것입니다.
따라서 질문 1과 2는 같은 의미입니다.
- 조건식에 사용할 수 있나요? :할 수 있다.
- 테스트 명령에 사용할 수 있나요? :예.
그러나 이는 귀하가 생각하는 것과는 다릅니다.
$ if [[ 1 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ 10 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ e < è ]]; then echo yes; else echo no; fi
yes
설명서에 따르면 이 비교는 다음과 같습니다.
True if string1 sorts before string2 lexicographically.
즉, 사전식으로(LC_COLLATE 변수의 영향을 받음)
간단한 테스트는 [
출력을 파일로 리디렉션합니다.
$ if [ e < è ]; then echo h; else echo b; fi
bash: è: No such file or directory
b
작동하게 하려면 백슬래시(따옴표 < 및 >)를 사용해야 합니다.
$ if [ e \< è ]; then echo h; else echo b; fi
h
하지만 < in 을 사용하는 것은 권장하지 않습니다 test
.
<, <=, >, >=가 사용될 수 있는 다른 장소는 산술 테스트 내부, 아마도 if 테스트의 일부일 수 있습니다.
$ if (( 12 <= 15 )); then echo "yes"; fi
yes
예, 이는 다음과 같습니다.
$ if [[ 12 -le 15 ]]; then echo "yes"; fi
yes
다음과 매우 유사합니다.
$ if [ 12 -le 15 ]; then echo "yes"; fi
yes
그렇습니다. 그게 전부입니다.
<= >= < > comparison
== != equality and inequality
&& logical AND
|| logical OR
산술식에 사용되는 조건식:
$ if (( ( ((2<3)&&(3>7)) * 18 ) == 0 )); then echo "yes"; fi
yes
이는 명령의 조건식과 다릅니다 test
.