zsh를 사용하여 숫자가 범위 내에 있는지 확인하십시오.

zsh를 사용하여 숫자가 범위 내에 있는지 확인하십시오.

인수로 0을 전달하면 거짓 긍정("True" 인쇄)이 발생하는 이유는 무엇입니까?

#!/bin/zsh

k="$1"

if ((0 < k < 1))
then
    echo "True"
fi

스크립트 이름은 스티치_applier.sh입니다.

단말기

% ./stitch_applier.sh 0
True

이는 Linux 시스템에서 실행됩니다.

답변1

쉘 산술은 이러한 연결 비교를 지원하지 않습니다. 대신 첫 번째는 관계가 참인지 여부에 따라 OR 을 a < b반환합니다 .10

그렇다면 k그렇다면 왼쪽 연관의 경우와 동일 0합니다 . 0은 0보다 작지 않으며 거짓이므로 산술적 맥락에서 . 그러면 우리는 이것이 사실이고 그게 전부라는 것을 알게 됩니다.((0 < k < 1))((0 < 0 < 1))(( (0 < 0) < 1))0 < 000 < 1

k범위 내에 있는지 테스트하려면 다음을 수행해야 합니다 ((0 < k && k < 1)).

Bash와 같은 쉘과 다른 많은 쉘은 정수 산술만 처리하며 0과 1 사이의 정수는 없으므로 이러한 쉘에서는 테스트가 항상 실패합니다. 그러나 Ksh와 Zsh는 부동 소수점 숫자를 처리할 수 있습니다.


운영자가 그렇군요C 언어로 작업하기, 그리고 다POSIX,불다그리고지쉬산술 연산자의 C 정의를 참조하세요. (POSIX는 $(( ))정의되지 않고 정의 만 정의 (( ))하지만 Bash와 Zsh는 두 가지 모두에서 동일한 방식으로 산술을 처리합니다. 그렇지 않으면 혼란스러울 것입니다.)

일부 최신 언어는 다르게 작동합니다. Python은 친숙하기로 유명합니다. 연결된 비교 지원, 그리고그리고C++유사한 지원을 추가하는 것은 적어도 논의되었습니다. C++ 문서 주석과 마찬가지로 누구도 a < b < c의도적으로 C 의미에서 주석을 사용하지 않습니다. ( (a < b) != (c < d)비슷한 용도가 있을 수도 있습니다. 관계 중 하나가 올바른지 확인합니다.) Perl과 GNU awk는 1 < 2 < 3.

관련 정보