산술 또는 조건식에 <=, >=, <, >, ==, !=, && 및 ||가 사용됩니까?

산술 또는 조건식에 <=, >=, <, >, ==, !=, && 및 ||가 사용됩니까?

Bash 매뉴얼에서 섹션 6.5 Shell Arithmetic은 다음과 같이 말합니다.

<= >= < > comparison
== != equality and inequality 

&& logical AND
|| logical OR

그 의미는 조건식에 사용된다는 뜻인 것 같습니다. 그러나 산술 표현식 섹션에는 나타납니다.

  1. 그런 다음 다음에서 사용할 수 있습니다.조건식?

    <=,>=,<,>,==,!=섹션 6.4에는 산술 표현식과 유사한 조건 표현식에 대한 연산자가 이미 있습니다.

    arg1은 arg2에서 작동합니다.

    OP는 "-eq", "-ne", "-lt", "-le", "-gt" 또는 "-ge" 중 하나입니다. 이러한 산술 이진 연산자는 arg1이 각각 arg2와 같거나, 같지 않거나, 작거나, 작거나 같거나, 크거나, 크거나 같은 경우 true를 반환합니다. Arg1 및 arg2는 양수 또는 음수일 수 있습니다.

    산술식의 합과 유사한 조건식에 대한 연산자도 이미 있습니다 &&.||

    • -a그에-o 대한test[...]
    • &&그리고 .||[[...]]

    이제 조건식에 대한 연산자를 도입했는데 왜 산술 표현식에 유사한 연산자를 도입해야 합니까?

  2. 그들은 다음을 위해 사용될 수 있습니다테스트 명령?

    우리는 if다음이 테스트 명령이라는 것을 알고 있습니다.

    if 명령의 구문은 다음과 같습니다.

    if test-commands; then
    consequent-commands;
    [elif more-test-commands; then
    more-consequents;]
    [else alternate-consequents;]
    fi
    

    [...]둘 다 [[...]]조건식을 취하고 테스트 명령을 생성합니다. 산술식을 사용할 수 있나요?

    나를 더욱 혼란스럽게 하는 것은 그 안에 있는 산술 [...]표현식이 [[...]]테스트 명령으로 사용될 때 [...]부정확하게 동작한다는 것입니다 [[...]].

    $ if [ 1 > 2 ]; then echo h; else echo b; fi
    h
    $ if [ 1 < 2 ]; then echo h; else echo b; fi
    h
    $ if [[ 1 < 2 ]]; then echo h; else echo b; fi
    h
    $ if [[ 1 > 2 ]]; then echo h; else echo b; fi
    b
    

답변1

이것은 매우 간단합니다. 당신은 이해 []하고 완전히 다른 짐승이 되어야 합니다 [[]].(())

[ expression ]bash의 모든 명령 호출과 같이 표현식을 인수로 사용하여 프로그램을 호출하면 됩니다 [(다른 이름 ). test즉, 특히 after [와 before 사이에 공백을 사용해야 하고 ], 키워드와 특수 문자는 이스케이프하거나 인용해야 하며, 변수는 일반적인 방식으로 확장되어야 합니다.

표현식에서 -gt, -lt및 관련은 숫자 비교에 사용되고, >, <정렬은 문자열 비교에 사용됩니다. [이는 bash와는 아무런 관련이 없으며, 모든 프로그램처럼 0(true) 또는 0이 아닌(false)을 평가하고 반환하는 표현식을 호출하는 명령일 뿐이라고 생각할 수 있습니다 .

부울 연산자 &&및 는 ||bash에 의해 해석되고 인수로 전달되지 않기 때문에 사용할 수 없습니다 test. 대신 사용 -a됩니다 -o. 하지만 언제든지 할 수 있습니다 [ test1 ] && [ test2 ] || [ test3 ]. 이는 bash일반적인 부울 연산자로 결합된 3개의 테스트 호출입니다(즉, 첫 번째 호출이 실패하면 두 번째 호출을 건너뜁니다).

여전히 bash자체 [(내장) 구현이 제공되지만 구문이 처리되는 방식은 변경되지 않습니다.

[[ ]](( ))명령에 대한 기본 제공 대체가 아니라 특수 구문의 일부이므로 다른 규칙이 적용됩니다 . 변수 이름 와일드카드를 처리하는 방법에 대한 자세한 내용은 매뉴얼 페이지를 참조하십시오. 부울 연산자 &&||일반적인 의미를 갖습니다.

하나 [[ ]]는 문자열 중심입니다. 모든 비교는 문자열을 기준으로 합니다(그러나 플랫폼에 따라 [다르지만 에서보다 더 "현대적"이고 로케일을 더 잘 인식합니다 test). 또한 파일 테스트, 정규식 등을 처리합니다.

(( ))산술 표현식 에 사용됩니다 . 변수 이름은 $거기에 있을 필요가 없으며 일반적으로 비교(숫자)를 포함하여 수학적 표현식을 작성할 수 있습니다. 이 경우의 비교는 다른 산술식과 다르지 않으며, true는 1이고 false는 0이며, (( x=y*(z>4) ))조건식에 사용하면 0이 아닌 것이 true이고 0이 false입니다. 결과를 $(( )).

그래서:

  • [[ ]]문자열 조건, 패턴 일치 및 파일 테스트
  • (( ))산술 표현식 및 조건
  • [ ]시험주문하다: 부울 및 비교 연산자를 처리하기 위한 특수 비표준 구문

답변2

"조건식"은 test [or [[명령이 내부적으로 사용하는 것입니다.

따라서 질문 1과 2는 같은 의미입니다.

  1. 조건식에 사용할 수 있나요? :할 수 있다.
  2. 테스트 명령에 사용할 수 있나요? :예.

그러나 이는 귀하가 생각하는 것과는 다릅니다.

$ if [[ 1 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ 10 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ e < è ]]; then echo yes; else echo no; fi
yes

설명서에 따르면 이 비교는 다음과 같습니다.

True if string1 sorts before string2 lexicographically.

즉, 사전식으로(LC_COLLATE 변수의 영향을 받음)

간단한 테스트는 [출력을 파일로 리디렉션합니다.

$ if [ e < è ]; then echo h; else echo b; fi
bash: è: No such file or directory
b

작동하게 하려면 백슬래시(따옴표 < 및 >)를 사용해야 합니다.

$ if [ e \< è ]; then echo h; else echo b; fi
h

하지만 < in 을 사용하는 것은 권장하지 않습니다 test.


<, <=, >, >=가 사용될 수 있는 다른 장소는 산술 테스트 내부, 아마도 if 테스트의 일부일 수 있습니다.

$ if (( 12 <= 15 )); then echo "yes"; fi
yes

예, 이는 다음과 같습니다.

$ if [[ 12 -le 15 ]]; then echo "yes"; fi
yes

다음과 매우 유사합니다.

$ if [ 12 -le 15 ]; then echo "yes"; fi
yes

그렇습니다. 그게 전부입니다.

<= >= < >     comparison
== !=         equality and inequality 
&&            logical AND
||            logical OR

산술식에 사용되는 조건식:

$ if (( ( ((2<3)&&(3>7)) * 18 ) == 0 )); then echo "yes"; fi
yes

이는 명령의 조건식과 다릅니다 test.

관련 정보