如何控制Shell脚本上的输入?

时间:2009-11-03 22:05:38

标签: linux bash shell

我从用户获取参数./inputControl.sh param1 param2 ... 我希望用户只能输入数字。不能输入任何单词等。

如果他们输入单词,我将向他们显示错误。

感谢答案

4 个答案:

答案 0 :(得分: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]+)?$"

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

答案 1 :(得分:0)

示例:检查数字

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

答案 2 :(得分:0)

Bash正则表达式很方便,但它们仅在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实用程序,永远支持regex,适用于非GNU和非Bash系统。 (它使用grep,如egrep,而不是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) ,如{{1}}。)

{{1}}

答案 3 :(得分:-1)

我不知道你怎么能这么做。我会使用提供正则表达式的perl或python脚本,这会更容易。