繁体   English   中英

bash,提示输入数字

[英]bash, prompt for numerical input

d是我使用的内部服务器查找工具。

我希望允许用户输入0(或1)和9999之间的任何数字(让我们将此用户输入称为输入),并显示以下结果:

d $ userinput(例如1234)

然后处理该查询的结果(以下内容除去了IP地址,但以后不再执行ping操作):

 grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'`

我知道我需要使用while true; 确实读过$ blah等。我只是对阅读不够熟悉,无法正确格式化它,更重要的是:

提示输入0-9999之间的数字

read命令不会自行提示。 在实际显示提示之前,请使用普通echo 使用echo -n不添加换行符。

如果只需要两个值之间的数字,则可以测试它们的值:

 read x
 while [[ $x -lt 0 || $x -gt 9999 ]]; do
    echo "bad value for x"
    read x
 done
 echo "x=$x"

<-编辑->

如果您只想提示,请尝试以下操作:

echo -n "Enter server number:"
read userinput

然后像这样对输入运行验证检查:

if [[ $userinput -lt 0 || $userinput -gt 9999 ]]   # checks that the input is within the desired range
 then
  echo "Input outside acceptable range."
else
  # insert your grep and ping stuff here
fi

<-结束编辑->

初读时,我认为您的问题听起来很适合包装脚本,因此我建议这样做:

$ cat wrapper.sh
#!/usr/bin/bash

userinput=$1

if [[ $# != 1 ]]   # checks that number of inputs is exactly one
 then
  echo "Too many inputs."
  exit 2
elif [[ $userinput -lt 0 || $userinput -gt 9999 ]]   # checks that the input is within the desired range
 then
  echo "Input outside acceptable range."
  exit 3
fi

output=`d "$userinput"`

ping_address=`grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' <("$output")`

ping "$ping_address"

然后像这样调用脚本:

$ wrapper.sh 1243

其他答案有很多缺陷,因为它们会检查用户是否输入了超出所需范围的数字 但是,如果用户输入的不是数字,该怎么办? 他们的策略从一开始就被打破了。

相反,最好仅在我们确定用户输入的数字在所需范围内时才松手。

while :; do
    read -ep 'Enter server number: ' number
    [[ $number =~ ^[[:digit:]]+$ ]] || continue
    (( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || continue
    # Here I'm sure that number is a valid number in the range 0..9999
    # So let's break the infinite loop!
    break
done

正则表达式[[ $number =~ ^[[:digit:]]+$ ]]确保用户仅输入了数字。

笨拙的(number=(10#$number))部分在这里,因此,如果用户输入以0开头的数字,bash会尝试以基数8解释它,而我们会得到错误的结果(例如,如果用户输入010 ),甚至在用户输入例如09时输入错误(在没有此保护的情况下尝试输入)。


如果您只想提示一次并在用户输入无效词时退出,那么您可以使用以下逻辑:

read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] || exit 1
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || exit 1
# Here I'm sure that number is a valid number in the range 0..9999

如果您想向用户解释为什么退出脚本,可以使用die函数,如下所示:

die() {
    (($#)) && printf >&2 '%s\n' "$@"
    exit 1
}
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] ||
    die '*** Error: you should have entered a number'
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) ||
    die '*** Error, number not in range 0..9999'
# Here I'm sure that number is a valid number in the range 0..9999

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM