정수 비교 : 산술 식 또는 조건식

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

arg1 OP arg2

OP는 -eq, -ne, -lt, -le, -gt 또는 -ge. 이러한 산술 이항 연산자는 arg1 arg2 와 같거나, 같지 않음, 작거나, 같거나, 크거나 같거나 같으면 true를 반환합니다. 각기. Arg1 arg2 는 양수 또는 음수 일 수 있습니다.

또는 산술 표현식 :

<= >= < > 비교

== != 동등성 및 부등식

두 정수를 비교하는 두 가지 방법이있는 이유는 무엇입니까? 언제 사용할까요?

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

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

댓글

  • = != < <= > >= 문자열 을 비교합니다. 1 -eq 01이지만 1 != 018 -lt 42이지만 8 > 42
  • 산술 표현식에 과부하가 걸립니다.
  • ' 각 기능이 언제 발생했는지 알아 보려면 bash 변경 로그를 검색해야합니다. 추가되었습니다. 테스트 명령보다 훨씬 늦게 산술식이 추가 된 것 같습니다.
  • 나는 문자열 비교에 대해 묻지 않습니다. @muru.

답변

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

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

  1. 관용구 [ ] 내부 산술 비교 연산자는 다음과 같습니다. -eq, -ne, -lt, -le, -gt-ge.

    또한 테스트 명령 및 [[ ]].

    이 관용구에는 예, =, < 등이 있습니다. 문자열 연산자.

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

    아니요, 이것은 “산술”이 아닙니다. 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의 맨 페이지에는 조건식 연산자 만 표시됩니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다