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 .. fi
case
그러나 패턴 일치를 사용하는 것 보다 더 복잡한 표현식이 있는 경우를 구별하기 위해 구문을 사용하는 것이 더 나은 경우가 많습니다 .
답변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
케이스 내부의 복잡성이 마음에 들지 않으면 최소한 정규식 일치가 잘 작동하고 간단합니다.