0 또는 0보다 큰지 확인하는 조건을 입력하는 방법

0 또는 0보다 큰지 확인하는 조건을 입력하는 방법

Case를 사용하여 이 기능을 실행하려고 합니다.

if [[ $input -gt 0 || $input -eq 0 ]];

만일을 대비해 입력이 0보다 크거나 0과 같거나 심지어 0이고 0보다 작은지 테스트하기 위해 케이스를 넣을 수 있습니까?

답변1

이 예제 sh스크립트는 변수가 정수인지 확인합니다.

#!/bin/sh

num=$1

if [ $num -eq $num ] 2> /dev/null
then
    case 1 in
        $(($num < 0))     ) echo $num is negative.;;
        $(($num <= 100))  ) echo $num is between 0 and 100.;;
        $(($num <= 1000)) ) echo $num is between 100 and 1000.;;
        *                 ) echo $num is greater than 1000.;;
    esac
else
    echo $num is not a number.
fi

변수가 숫자인지 확인하기 위해 연산자를 사용합니다 -eq. stderr숫자가 아닌 경우 출력을 억제해야 합니다 .

변수에 정수가 포함되어 있으면 case레이아웃 양식의 범위가 평가됩니다. 표현식은 $(( some comparison ))true(1) 또는 false(0)로 평가되므로 지정된 범위 목록을 테스트할 수 있습니다.

답변2

정수를 올바르게 처리하지 않고 정수만 처리해야 하는 경우 -0다음이 작동합니다.

case "$input" in
''|*[!0-9-]*|[0-9-]*-*)
  echo "invalid input"      
  ;;
[0-9]*)
  echo "input >= 0"
  ;;
-[1-9]*)
 echo "input < 0"
 ;;
*)
 echo "invalid input"
 ;;
esac

if .. then .. elif ... then .. else .. ficase그러나 패턴 일치를 사용하는 것 보다 더 복잡한 표현식이 있는 경우를 구별하기 위해 구문을 사용하는 것이 더 나은 경우가 많습니다 .

답변3

[ "$input" -gt -1 ] || exit

...또는...

case ${input:?NULL} in 
(?*[!0-9]*|[!-0-9]*|[!0-9]) ! : ;;
(-*[!0]*)  echo \<0 ;;
(*[!0]*)   echo \>1 ;;
(0*)       echo 0   ;;
esac 

답변4

case $([[ $input =~ ^-?[0-9]+$ ]] && [[ $input -gt 0 || $input -eq 0 ]] ; echo $?) in
0)
        echo "good"
        ;;
1)
        echo "bad"
        ;;
*)
        echo "weird"
        ;;
esac

케이스 내부의 복잡성이 마음에 들지 않으면 최소한 정규식 일치가 잘 작동하고 간단합니다.

관련 정보