예, 두 정수를 비교하는 두 가지 방법이 있습니다.

예, 두 정수를 비교하는 두 가지 방법이 있습니다.

Bash에서는 조건식을 사용하여 두 정수를 비교할 수 있습니다.

아르기닌1OP아르기닌 2

-eqOP 는 -ne, -lt, -le또는 중 하나입니다 . 이러한 산술 이진 연산자는 다음과 같은 경우 true를 반환합니다.-gt-ge아르기닌1같음, 같지 않음, 작음, 작거나 같음, 크거나 크거나 같음아르기닌 2, 각각.아르기닌1그리고아르기닌 2양수 또는 음수일 수 있습니다.

또는 산술 표현식:

<= >= < >비교하다

== !=평등과 불평등

두 정수를 비교하는 두 가지 방법이 있는 이유는 무엇입니까? 언제 어느 것을 사용해야 합니까?

예를 들어 [[ 3 -lt 2 ]]조건식을 사용하고 (( 3 < 2 ))산술식을 사용합니다. 비교가 참이면 둘 다 0을 반환합니다.

두 정수를 비교할 때 이 두 가지 방법을 서로 바꿔서 사용할 수 있습니까? 그렇다면 왜 Bash에는 하나가 아닌 두 가지 방법이 있습니까?

답변1

예, 두 정수를 비교하는 두 가지 방법이 있습니다.

이러한 사실은 이 포럼에서 널리 받아들여지지 않는 것 같습니다.

  1. 이 관용구에서 [ ]산술 비교에 사용되는 연산자는 -eq, -ne, 및 -lt입니다 -le.-gt-ge

    그들은 또한 명령과 [[ ]].

    예, 이 관용구에서 , =<은 문자열 연산자입니다.

  2. 이 관용구에서 (( ))산술 비교에 사용되는 연산자는 ==, !=, <, <=, >및 입니다 >=.

    $아니요, 이것은 "산술 확장"(으로 시작 )이 아닙니다 $(( )). 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-lttest 0 = 00test 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이 숫자인지 문자열인지 알지 못합니다. 올바른 결과를 얻으려면 컴퓨터에 무엇을 해야 하는지 알려주는 다양한 연산자가 필요합니다. 몇 가지 추가 정보가 있습니다.여기이것은 몇 가지 역사를 설명합니다. 기본적으로 이러한 변수는 유형이 지정되지 않으며 기록 호환성을 위해 그대로 유지됩니다.

관련 정보