如何输入条件检查0或大于0的情况

如何输入条件检查0或大于0的情况

我正在尝试使用 case 来运行这个函数

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

是否可以放入 case 来测试输入是否大于 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 ))计算结果为“真”(1) 或“假”(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

如果您不喜欢案例内部的复杂性,至少正则表达式匹配工作良好且简单。

相关内容