Bash에서는 조건식을 사용하여 두 정수를 비교할 수 있습니다.
arg1 OP arg2
OP는
-eq
,-ne
,-lt
,-le
,-gt
또는-ge
. 이러한 산술 이항 연산자는 arg1 이 arg2 와 같거나, 같지 않음, 작거나, 같거나, 크거나 같거나 같으면 true를 반환합니다. 각기. Arg1 및 arg2 는 양수 또는 음수 일 수 있습니다.
또는 산술 표현식 :
<= >= < >
비교
== !=
동등성 및 부등식
두 정수를 비교하는 두 가지 방법이있는 이유는 무엇입니까? 언제 사용할까요?
예를 들어 [[ 3 -lt 2 ]]
는 조건식을 사용하고 (( 3 < 2 ))
는 산술 식을 사용합니다. 비교가 참이면 둘 다 0을 반환합니다.
두 정수를 비교할 때이 두 방법은 항상 서로 바꿔서 사용할 수 있습니까? 그렇다면 Bash에는 왜 하나가 아닌 두 가지 방법이 있습니까?
댓글
답변
예, 두 정수를 비교하는 두 가지 방법이 있습니다.
이러한 사실은이 포럼에서 널리 받아 들여지지 않는 것 같습니다.
-
관용구
[ ]
내부 산술 비교 연산자는 다음과 같습니다.-eq
,-ne
,-lt
,-le
,-gt
및-ge
.또한 테스트 명령 및
[[ ]]
.이 관용구에는 예,
=
,<
등이 있습니다. 문자열 연산자. -
(( ))
관용구 내부에서 산술 비교 연산자는==
입니다. ,!=
,<
,<=
,>
및>=
.아니요, 이것은 “산술”이 아닙니다. etic expansion “(
$
로 시작)을$(( ))
로 지정합니다. man bash에서는 “복합 명령”으로 정의됩니다.예, “산술 확장”과 동일한 규칙 (내부적으로)을 따르지만 출력은없고 종료 값만 있습니다. 다음과 같이 사용할 수 있습니다.
if (( 2 > 1 )); then ...
두 정수를 비교하는 두 가지 방법이있는 이유는 무엇입니까?
후자의 (( ))
는 산술 테스트를 수행하는 더 간단한 방법으로 개발 된 것 같습니다. $(( ))
와 거의 동일하지만 출력이 없습니다.
왜 두 개입니까? 두 개의 printf
(외부 및 내장) 또는 네 개의 테스트 (외부 test
, 내장 , [
및 [[
). 이것이 바로 껍질이 자라는 방식으로, 1 년 내에 일부 영역이 개선되고 내년에 일부 영역이 개선됩니다.
언제 어느 것을 사용해야합니까?
그것은 매우 어려운 질문입니다. 효과적인 차이가 없어야합니다. 물론 [ ]
가 내부적으로 작동하는 방식과 (( ))
가 내부적으로 작동하는 방식에는 약간의 차이가 있지만 두 정수를 비교하는 것이 더 낫습니다. 하나!.
두 정수를 비교할 때이 두 가지 방법을 항상 같은 의미로 사용할 수 있습니까?
두 숫자에 대해서는 예라고 말해야합니다.
그러나 변수의 경우 확장 , 수학 연산은 둘 중 하나를 선호해야하는 주요 차이점이있을 수 있습니다. 나는 절대적으로 둘 다 동등하다고 말할 수 없습니다. 우선, (( ))
는 여러 가지 수학 연산을 순서대로 수행 할 수 있습니다.
if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi
그렇다면 Bash가 한 가지가 아닌 두 가지 방법이 있습니까?
둘 다 도움이된다면 그 이유는 무엇입니까?
댓글
-
=
는 할당이고==
는 산술 확장에서의 비교입니다. 질문은 그것을 정확하게 인용합니다. 그러나 대답은 틀렸다. - 또한
(
는 bash에서 예약어가 아니므로((
주위에 공백을 둘 필요가 없습니다.[
또는[[
Answer
역사적으로 test
명령이 가장 먼저 존재했습니다 (최소한 Unix Seventh Edition
a> 1979). 문자열을 비교하기 위해 =
및 !=
연산자를 사용하고 -eq
, -ne
, -lt
등을 사용하여 숫자를 비교합니다. 예를 들어 test 0 = 00
는 false이지만 test 0 -eq 00
는 true입니다. 이 구문이 왜 선택되었는지는 모르겠지만 셸에서 사용할 수있는 <
및 >
를 사용하지 않는 것이 좋습니다. 리디렉션 연산자로 구문 분석되었습니다. test
명령은 몇 년 후 또 다른 구문을 얻었습니다. [ … ]
는 test …
.
[[ … ]]
조건부 구문, 내부에 <
및 >
는 따옴표없이 연산자로 사용할 수 있으며 나중에 ksh에서 추가되었습니다. [ … ]
와 하위 호환성을 유지하여 동일한 연산자를 사용했지만
및 >
: 문자열 비교 (예 : [[ 9 > 10 ]]
그러나 [[ 9 -lt 10 ]]
). 자세한 내용은 단일 또는 이중 대괄호 사용-bash
를 참조하십시오.
산술 식도 test
명령,
Korn 쉘에서 , 1980 년대 어느 시점. 그들은 C 언어의 구문을 따랐는데, 이것은 Unix 서클에서 매우 인기가있었습니다. 따라서 그들은 C “연산자를 사용했습니다. 같음에는 ==
, 작거나 같으면 <=
등입니다.
Unix Seventh Edition에는 산술식이 없었지만 expr
명령 이있었습니다. 비교 연산자를 포함하여 정수 연산을위한 C와 유사한 구문. 쉘 스크립트에서 문자 <
및 >
는 쉘로부터 보호하기 위해 인용되어야합니다. if expr 1 \< 2; …
는 if test 1 -lt 2; …
와 같습니다. 쉘에 산술 표현식이 추가됨에 따라 expr
의 대부분의 사용이 폐기되었으므로 오늘날에는 잘 알려지지 않았습니다.
sh 스크립트에서 당신은 ” d는 일반적으로 산술 식을 사용하여 정수 값을 계산하고 [ … ]
를 사용하여 정수를 비교합니다.
if [ "$((x + y))" -lt "$z" ]; then …
ksh에서 , bash 또는 zsh 스크립트의 경우 둘 다 ((…))
를 사용할 수 있습니다.
if ((x + y < z)); then …
[[ … ]]
형식은 정수 이외의 조건을 사용하려는 경우에 유용합니다.
Answer
테스트 매뉴얼 페이지 = 및! =는 문자열 비교에 사용되는 반면 -eq, -gt, -lt, -ge, -le 및 -ne 표현식은 정수 비교입니다. 쉘 스크립트를 작성할 때 항상이 규칙을 따랐고 항상 작동합니다. 표현식에 변수가있는 경우 널 비교를 피하기 위해 어떤 식 으로든 변수를 인용해야 할 수도 있습니다.
종이에서는 별다른 생각없이 문자열 / 숫자 비교를 수행합니다. 반면에 컴퓨터는 987이 숫자인지 문자열인지 알지 못합니다. 올바른 결과를 얻으려면 컴퓨터에 무엇을해야하는지 알려줄 다른 운영자가 필요합니다. 일부 역사를 설명하는 추가 정보가 여기 에 있습니다. 본질적으로 변수는 유형이 지정되지 않았으며 역사적 호환성을 위해 그대로 유지되었습니다.
댓글
- 내 게시물에서
=
및!=
는 산술 연산자이며test
의 맨 페이지에는 조건식 연산자 만 표시됩니다.
= != < <= > >=
문자열 을 비교합니다.1 -eq 01
이지만1 != 01
및8 -lt 42
이지만8 > 42