Shell脚本 - 确切找到数字的Case语句(不带+, - ,/,*)

时间:2016-09-05 10:55:13

标签: shell switch-statement sh

简言之,

我有一个变量($ num),其中包含随机数(max.18),我需要shell中的case语句(因为还有检查号,我也有一些字母条件),这应该验证用户输入变量(必须小于$ num)。

前:

case $input in
...
1) ... ;;
2) ... ;;
...

所以,如果我只有两个条件而不是我可以写这样的代码,但是我的变量$ num包含随机数,我怎样才能编写满足我下面要求的条件条件。

  • 如果用户输入的数字如(1 / 3,3 * 1,3-2,2 + 1)则不应验证为数字
  • 如果用户输入的数字如(0001或01或000001),则不应验证为数字

只有当用户在1- $ num之间输入数字时才应执行案例条件,不允许使用其他数字格式或符号。

例如:

case $input in
[nN*]) ...
[aA*]) ...
 ...
 *) if echo "$input" | egrep '^\-?[0-9]+$'; then
    typeset -LZ num
    num="$input"
       if [ "$input" != "$num" ]; then
            echo "$input not a valid number"
       fi
    else
        echo "please choose proper choice option"
    fi
    ;;

这段代码有效但我想要一个正常的情况条件,它应该满足我的要求,比如如果我们有两个或三个选项我们可以简单地编写代码但是如果我们有随机选项(可能会减少或增加)如何编写一个在这种情况下的情况。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果case的使用不是强制性的,请尝试使用一些正则表达式验证来更好地控制允许的内容和不允许的内容:

[[ $input =~ ^[1-9][0-9]*$ ]]
#            ^  ^    ^   ^
#    beginning  |    |   end
#               |    any digit
#       a digit from 1 to 9

这会检查$input中的数据是否包含不以0开头的数字。

$ r=001
$ [[ $r =~ ^[1-9][0-9]*$ ]] && echo "yes"
$

$ r=1
$ [[ $r =~ ^[1-9][0-9]*$ ]] && echo "yes"
yes

$ r="3+1"
$ [[ $r =~ ^[1-9][0-9]*$ ]] && echo "yes"
$

然后,您可以检查该数字是否低于存储的数字:

[ $r -le $num ]

所有在一起:

$ num=15

$ r=5
$ [[ $r =~ ^[1-9][0-9]*$ ]] && [ $r -le $num ] && echo "yes"
yes

$ r=19
$ [[ $r =~ ^[1-9][0-9]*$ ]] && [ $r -le $num ] && echo "yes"
$

$ r="3+1"
$ [[ $r =~ ^[1-9][0-9]*$ ]] && [ $r -le $num ] && echo "yes"
$

答案 1 :(得分:0)

read -p "enter number" yournumber
re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
   echo "error: Not a number" >&2; exit 1
fi

这只是您需要执行的代码的其余部分。