![예, 두 정수를 비교하는 두 가지 방법이 있습니다.](https://linux55.com/image/6875/%EC%98%88%2C%20%EB%91%90%20%EC%A0%95%EC%88%98%EB%A5%BC%20%EB%B9%84%EA%B5%90%ED%95%98%EB%8A%94%20%EB%91%90%20%EA%B0%80%EC%A7%80%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
Bash에서는 조건식을 사용하여 두 정수를 비교할 수 있습니다.
아르기닌1OP아르기닌 2
-eq
OP 는-ne
,-lt
,-le
또는 중 하나입니다 . 이러한 산술 이진 연산자는 다음과 같은 경우 true를 반환합니다.-gt
-ge
아르기닌1같음, 같지 않음, 작음, 작거나 같음, 크거나 크거나 같음아르기닌 2, 각각.아르기닌1그리고아르기닌 2양수 또는 음수일 수 있습니다.
또는 산술 표현식:
<= >= < >
비교하다
== !=
평등과 불평등
두 정수를 비교하는 두 가지 방법이 있는 이유는 무엇입니까? 언제 어느 것을 사용해야 합니까?
예를 들어 [[ 3 -lt 2 ]]
조건식을 사용하고 (( 3 < 2 ))
산술식을 사용합니다. 비교가 참이면 둘 다 0을 반환합니다.
두 정수를 비교할 때 이 두 가지 방법을 서로 바꿔서 사용할 수 있습니까? 그렇다면 왜 Bash에는 하나가 아닌 두 가지 방법이 있습니까?
답변1
예, 두 정수를 비교하는 두 가지 방법이 있습니다.
이러한 사실은 이 포럼에서 널리 받아들여지지 않는 것 같습니다.
이 관용구에서
[ ]
산술 비교에 사용되는 연산자는-eq
,-ne
, 및-lt
입니다-le
.-gt
-ge
그들은 또한 명령과
[[ ]]
.예, 이 관용구에서 ,
=
등<
은 문자열 연산자입니다.이 관용구에서
(( ))
산술 비교에 사용되는 연산자는==
,!=
,<
,<=
,>
및 입니다>=
.$
아니요, 이것은 "산술 확장"(으로 시작 )이 아닙니다$(( ))
. man bash에서는 "복합 명령"으로 정의됩니다.예, "산술 확장"(내부적으로)과 동일한 규칙을 따르지만 출력은 없고 종료 값만 있습니다. 다음과 같이 사용할 수 있습니다.
if (( 2 > 1 )); then ...
두 정수를 비교하는 두 가지 다른 방법이 있는 이유는 무엇입니까?
(( ))
나는 후자가 산술 테스트를 수행하는 더 간단한 방법으로 개발되었다고 생각합니다 . 와 거의 동일 $(( ))
하지만 출력이 없습니다.
왜 두 개인가요? 이는 두 개의 printf
테스트(외부 및 내장) 또는 네 개의 테스트(외부 test
, 내장 및 test
) 가 있는 것과 같은 이유입니다 . 이것이 껍질이 자라는 방식으로, 일부 영역은 1년에 개선되고 다른 영역은 다음 해에 개선됩니다.[
[[
언제 어느 것을 사용해야 합니까?
유효한 차이점이 있어서는 안 되기 때문에 이는 매우 까다로운 질문입니다. 물론 a의 작동 [ ]
방식과 a의 내부 작동 방식에는 약간의 차이가 있습니다 (( ))
. 하지만 두 정수를 비교하려면 어느 것이 더 낫습니까? 누구나! .
두 정수를 비교할 때 이 두 가지 방법을 서로 바꿔서 사용할 수 있습니까?
두 숫자 모두에 대해 나는 그렇다고 대답해야 합니다.
그러나 변수, 확장, 수학 연산의 경우 둘 중 하나를 선호하는 주요 차이점이 있을 수 있습니다. 그 둘이 절대적으로 동등하다고 말할 수는 없다. 우선, (( ))
여러 수학 연산을 순차적으로 수행할 수 있습니다.
if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi
그렇다면 왜 Bash에는 하나가 아닌 두 가지 방법이 있습니까?
둘 다 도움이 된다면 왜 안 될까요?
답변2
역사적으로 이 test
명령은 처음으로 존재했습니다(적어도유닉스 버전 71979). 문자열을 비교하려면 =
and 연산자를 사용하고 , 숫자를 비교하려면 , 등을 사용 합니다. 예를 들어, 그것은 거짓이지만 사실입니다. 이 구문이 선택된 이유는 모르겠지만 아마도 쉘이 리디렉션 연산자로 구문 분석할 and 사용을 피하기 위함일 것입니다. 몇 년 후 이 명령 에는 .!=
-eq
-ne
-lt
test 0 = 00
test 0 -eq 00
<
>
test
[ … ]
test …
조건부 구문 [[ … ]]
( <
및 >
따옴표가 없는 연산자로 사용될 수 있음)은 나중에 ksh에 추가되었습니다. 이전 버전과의 호환성을 유지하므로 [ … ]
동일한 연산자를 사용하지만 문자열을 비교하기 <
위해 합계를 추가합니다 >
(예: [[ 9 > 10 ]]
but [[ 9 -lt 10 ]]
). 자세한 내용은 다음을 참조하세요.단일 또는 이중 괄호 사용 - bash
산술 표현식도 test
명령보다 늦게 나타납니다.Korn 쉘에서, 1980년대 어느 날. 이는 Unix계에서 매우 인기 있는 C 언어의 구문을 따릅니다. 그래서 그들은 C의 연산자( ==
같음, <=
작거나 같음 등) 를 사용했습니다.
유닉스 버전 7에는 산술 표현식이 없었지만expr
주문하다, 비교 연산자를 포함하여 정수 산술을 위한 C와 유사한 구문도 구현합니다. 쉘 스크립트에서 문자 <
및 >
는 쉘로부터 보호하기 위해 인용되어야 합니다. 즉, if expr 1 \< 2; …
와 동일합니다 if test 1 -lt 2; …
. 쉘에 산술 표현식을 추가하면 대부분의 사용이 더 이상 사용되지 않으므로 expr
오늘날에는 잘 알려져 있지 않습니다.
sh 스크립트에서는 일반적으로 산술 표현식을 사용하여 정수 값을 계산하고 [ … ]
정수를 비교합니다.
if [ "$((x + y))" -lt "$z" ]; then …
ksh, bash 또는 zsh 스크립트에서 둘 다 사용할 수 있습니다 ((…))
.
if ((x + y < z)); then …
[[ … ]]
이 형식은 정수 이외의 항목과 관련된 조건을 사용하려는 경우 유용합니다.
답변3
테스트 매뉴얼 페이지에 따르면 = 및 !=는 문자열 비교에 사용되는 반면 -eq, -gt, -lt, -ge, -le 및 -ne 표현식은 정수 비교에 사용됩니다. 나는 쉘 스크립트를 작성할 때 항상 이 규칙을 따르며 항상 작동합니다. 표현식에 변수가 있는 경우 Null 비교를 피하기 위해 어떤 방식으로든 변수를 참조해야 할 수도 있습니다.
서류상에서는 생각하지 않고 문자열/숫자 비교를 수행합니다. 반면에 컴퓨터는 987이 숫자인지 문자열인지 알지 못합니다. 올바른 결과를 얻으려면 컴퓨터에 무엇을 해야 하는지 알려주는 다양한 연산자가 필요합니다. 몇 가지 추가 정보가 있습니다.여기이것은 몇 가지 역사를 설명합니다. 기본적으로 이러한 변수는 유형이 지정되지 않으며 기록 호환성을 위해 그대로 유지됩니다.