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


20

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

arg1 OP arg2

영업 이익 중 하나입니다 -eq, -ne, -lt, -le, -gt, 또는 -ge. 이 산술 이항 연산자 는 arg1arg2 와 같거나 같지 않거나, 작거나 같거나, 크거나 같거나 같으면 true를 반환합니다 . Arg1arg2 는 양 또는 음의 정수일 수있다.

또는 산술 식 :

<= >= < > 비교

== != 평등과 불평등

왜 두 정수를 비교하는 두 가지 방법이 있습니까? 언제 사용합니까?

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

두 정수를 비교할 때이 두 방법을 항상 호환 적으로 사용할 수 있습니까? 그렇다면 Bash에 왜 하나가 아닌 두 가지 방법이 있습니까?


1
= != < <= > >=문자열을 비교하십시오 . 1 -eq 01하지만 1 != 01하고 8 -lt 42있지만8 > 42
dave_thompson_085

산술 표현식에 과부하가 걸립니다.
Tim

1
각 기능이 추가 된 시점을 확인하려면 bash 변경 로그를 검색해야합니다. 산술 표현식이 테스트 명령보다 훨씬 늦게 추가 된 것 같습니다.
glenn jackman

문자열 비교에 대해 묻지 않습니다. @muru.
Tim

답변:


28

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

이 사실은이 포럼에서 널리 인정되지 않는 것 같습니다.

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

    그들은 또한 테스트 명령 내부와 내부에 [[ ]]있습니다.

    예,이 숙어 내부, =, <, 등 문자열 연산자입니다.

  2. 관용구 내부 (( ))산술 비교 연산자는 ==, !=, <, <=, >,와 >=.

    아니요, 이것은 "산술 확장"(으로 시작 $) 이 아닙니다 $(( )). man bash에서 "복합 명령"으로 정의됩니다.

    예, "산술 확장"과 동일한 규칙 (내부)을 따르지만 출력은없고 종료 값만 있습니다. 다음과 같이 사용할 수 있습니다.

if (( 2 > 1 )); then ...

왜 두 정수를 비교하는 두 가지 방법이 있습니까?

후자 (( ))는 산술 테스트를 수행하는 더 간단한 방법으로 개발 된 것 같습니다. 거의 동일 $(( ))하지만 출력이 없습니다.

왜 두? 그런데 우리가이 왜 같은 printf(외부 및 내장) 또는 네 개의 테스트 (외부 test, 내장을 test, [그리고 [[). 이것이 껍질이 자라서 1 년 안에 일부 지역이 개선되고 내년에 다른 지역이 개선되는 방식입니다.

언제 사용합니까?

효과적인 차이가 없어야하기 때문에 매우 어려운 질문입니다. 물론 내부 [ ]작업과 작업 방식에 약간의 차이가 (( ))있지만 두 정수를 비교하는 것이 더 낫습니다. 하나!

두 정수를 비교할 때이 두 방법을 항상 호환 적으로 사용할 수 있습니까?

두 숫자에 대해서는 '그렇다'라고 강요받습니다.
그러나 변수, 확장, 수학 연산의 경우 서로 선호하는 주요 차이점이있을 수 있습니다. 나는 절대적으로 둘 다 같다고 말할 수 없습니다. 우선, (( ))여러 수학 연산을 순서대로 수행 할 수 있습니다.

if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi

그렇다면 Bash에 왜 하나가 아닌 두 가지 방법이 있습니까?

둘 다 도움이된다면, 왜 안됩니까?.


1
=대입이며 ==산술 확장의 비교입니다. 질문은 올바르게 인용합니다. 그러나 대답은 틀렸다.
ceving

12

역사적 test으로이 명령은 처음에 존재했습니다 (최소한 1979 년 Unix Seventh Edition 까지 ). 이 연산자를 사용 =하고 !=문자열을 비교하고, -eq, -ne, -lt숫자를 비교하는 등. 예를 들어, test 0 = 00false이지만 test 0 -eq 00true입니다. 이 구문이 선택된 이유를 잘 모르겠지만, 그것을 사용하지 않는 것이되었을 수도 <>쉘이 리디렉션 연산자로 분석 한 것이다. test명령은 몇 년 후 또 다른 구문을 가지고 : [ … ]동일합니다 test ….

[[ … ]]되는 내부 조건부 구문 <>인용없이 연산자로서 사용될 수는 KSH에 나중에 첨가 하였다. 이과의 호환성을 유지 [ … ]가 동일한 연산자를 사용하지만, 추가되도록 <하고 >문자열을 비교하는 (예를 들어, [[ 9 > 10 ]]하지만 [[ 9 -lt 10 ]]). 자세한 내용은 단일 또는 이중 괄호 사용-bash를 참조하십시오.

1980 년대에 Korn 쉘에서 산술 표현은 test명령 보다 늦게 나왔습니다 . 그들은 C 언어의 구문을 따랐으며, 이는 Unix 서클에서 매우 인기가있었습니다. 따라서 그들은 C의 연산자를 사용했습니다 : 평등, 동등 하지 않은 등.==<=

Unix Seventh Edition에는 산술 표현식이 없지만 비교 연산자를 포함하여 정수 연산에 대해 C와 유사한 구문을 구현하는 exprcommand 가 있습니다. 쉘 스크립트에서 문자 <>가지고는 예는, 쉘로부터 보호하기 위해 인용 수 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 

[[ … ]]당신이 정수가 아닌 다른 일을 포함하는 조건문을 사용하려면 양식에 유용합니다.


1

테스트 매뉴얼 페이지에 따르면, -eq, -gt, -lt, -ge, -le 및 -ne 표현식은 정수 비교에 = 및! =가 문자열 비교에 사용됩니다. 쉘 스크립트를 작성할 때 항상이 규칙을 준수했으며 항상 작동합니다. 식에 변수가있는 경우 null 비교를 피하기 위해 어떤 식 으로든 변수를 인용해야 할 수 있습니다.

종이에서는 많은 생각없이 문자열 / 숫자 비교를 수행합니다. 반면에 컴퓨터는 987이 숫자인지 또는 문자열인지 알 수 없습니다. 올바른 결과를 얻으려면 컴퓨터에 무엇을해야하는지 알려주려면 다른 운영자가 필요합니다. 이력 중 일부를 설명 하는 추가 정보가 여기 에 있습니다. 본질적으로 변수는 유형이 지정되지 않았으며 이전 버전과의 호환성을 위해 그대로 유지되었습니다.


내 게시물에서, = 그리고 !=, 산술 연산자입니다 동안의 맨 페이지 test만 보여 조건식 연산자.
Tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.