如何解决使用 Bash 检查数字是单数、双数还是三位数
我正在尝试实现一个 Bash 脚本,用于检查用户给出的数字是否为单/2 位/3 位。我只能使用 case..esac 语句。以下程序适用于单个数字,但不执行案例的重置。
echo -e "\n-----NUMBER CHECK-----"
echo -e -n "\nEnter a number: "
read num
case $num in
[0-9])
echo -e "\nSINGLE DIGIT NUMBER!"
;;
[10-99])
echo -e "\nDOUBLE DIGIT NUMBER!"
;;
[100-999])
echo -e "\nTRIPLE DIGIT NUMBER!"
;;
*)
echo -e "\nInvalid Input!"
;;
esac
解决方法
我会先验证输入。
case $num in
*[!0-9]*|????*) ;; # invalid input
?) ;; # single digit
??) ;; # double digit
???) ;; # triple digit
esac
,
[]
是一个 字符 类。用于指定范围的 -
仅处理字符,而不处理整数。 [100-999]
是一个带有 ...
- 字符
1
,0
- 范围
0-9
- 以及字符
9
和9
...所以基本上是[0-9]
。
正如 Jetchisel 所指出的,使用 [0-9][0-9]
和 [0-9][0-9][0-9]
。
类似的东西。
#!/usr/bin/env bash
printf '\n-----NUMBER CHECK-----\n\n'
read -rp 'Enter a number: ' num
case $num in
[0-9])
printf '\nSINGLE DIGIT NUMBER!'
;;
[0-9][0-9])
printf '\nDOUBLE DIGIT NUMBER!'
;;
[0-9][0-9][0-9])
printf '\nTRIPLE DIGIT NUMBER!'
;;
*)
printf >&2 '\nINVALID INPUT!'
;;
esac
如果您的 bash 版本支持,另一种方法是使用 test =~
运算符使用正则表达式模式匹配。
#!/usr/bin/env bash
printf '\n-----NUMBER CHECK-----\n\n'
read -rp 'Enter a number: ' num
if [[ $num =~ ^[[:digit:]]{1}$ ]]; then
printf '\nSINGLE DIGIT NUMBER!'
elif [[ $num =~ ^[[:digit:]]{2}$ ]]; then
printf '\nDOUBLE DIGIT NUMBER!'
elif [[ $num =~ ^[[:digit:]]{3}$ ]]; then
printf '\nTRIPLE DIGIT NUMBER!'
else
printf >&2 '\nINVALID INPUT!'
fi
,
另一种但被黑的解决方案:
echo -e "\n-----NUMBER CHECK-----"
echo -e -n "\nEnter a number: "
read num
case $num in
*[!0-9]*|????*) good=0 ;;
*) good=1;
esac
case 1 in
$((good == 1 && num <= 9)))
echo -e "\nSINGLE DIGIT NUMBER!"
;;
$((good == 1 && num <= 99)))
echo -e "\nDOUBLE DIGIT NUMBER!"
;;
$((good == 1 && num <= 999)))
echo -e "\nTRIPLE DIGIT NUMBER!"
;;
*)
echo -e "\nInvalid Input!"
;;
esac
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。