我正在尝试使用 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
如果您不喜欢案例内部的复杂性,至少正则表达式匹配工作良好且简单。