[英]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.