2009-11-03 111 views
0

我从用户获取参数./inputControl.sh param1 param2 ... 我希望用户只能输入数字。不能输入任何单词等。如何控制Shell脚本的输入?

如果他们输入的话我会向他们显示错误。

感谢您的回答

+0

你需要接受花车或只是整数? – 2009-11-03 22:15:25

回答

2

Bash有对正则表达式

#!/usr/bin/bash 
param1=$1 
param2=$2 

number_regex="^[0-9]+$" 

if ![[ $param1 ]] || [[ $param1 !~ $number_regex ]] ; then 
    echo Param 1 must be a number 
    exit 1 
fi 
if ![[ $param2 ]] || [[ $param2 !~ $number_regex ]] ; then 
    echo Param 2 must be a number 
    exit 1 
fi 

如果你也能接受浮点数,那么你可以设置number_regex喜欢的东西半像样的支持:

"^[+-]?[0-9]+\.?[0-9]*$" 

"^[+-]?[0-9]+\.?[0-9]*([eE][+-]?[0-9]+)?$" 

(最后两个正则表达式未经测试,可能不完全正确)。

+0

''^^[+ - ]?[0-9] + $“'允许负整数 – mob 2009-11-04 00:07:05

+0

感谢您的良好回答 – FTI 2009-11-04 00:21:11

+0

我找不到任何对'!〜'的引用,并且它不起作用Bash 3.2。你的'if'语句可以被重写和简化为:if [[[!! param1 || ! $ param1 =〜$ number_regex]]'。 – 2009-11-04 05:30:07

-1

我不知道您如何轻松地做到这一点。我会使用提供正则表达式的perl或python脚本,它会更容易。

0

例如:适用于数字

$ echo 1234d | awk '{print $0+0==$0?"yes number":"no"}' 
no 
$ echo 1234 | awk '{print $0+0==$0?"yes number":"no"}' 
yes number 
+0

你的回答简单而合乎逻辑,正在努力:)谢谢 – FTI 2009-11-04 00:22:28

0

猛砸正则表达式是方便,但他们只在3.1中引入和3.2改变引用规则。

[[ 'abc' =~ '.' ]] # fails in ≤3.0 
        # true in =3.1 
        # false in ≥3.2 
        # except ≥4.0 with "shopt -s compat31" 
[[ 'abc' =~ . ]] # fails in ≤3.0 
        # true in ≥3.1 

而他们甚至没有必要摆在首位! expr一直是一个标准的shell实用程序,永久支持正则表达式支持,适用于非GNU和非Bash系统。 (它使用basic (old) regular expressionsgrep,而不是像extended (new) regular expressionsegrep。)

expr 'abc' : '.'  # outputs '1' (characters matched), returns 0 (success) 
expr 'abc' : '.\(.\).' # outputs 'b' (group matched), returns 0 (success) 
expr 'abc' : ....  # outputs '0', returns 1 (failure)