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之间的数字输入
答案 0 :(得分:0)
read
命令不会提示自己。使用普通echo
之前实际显示提示。使用echo -n
不添加换行符。
答案 1 :(得分:0)
如果您只想要两个值之间的数字,可以测试它们的值:
read x
while [[ $x -lt 0 || $x -gt 9999 ]]; do
echo "bad value for x"
read x
done
echo "x=$x"
答案 2 :(得分:0)
< - 编辑 - >
如果你想要的只是提示的机制,试试这个:
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
答案 3 :(得分:0)
其他答案有很多缺陷,因为他们会检查用户是否输入了他们想要的范围之外的数字。但是如果用户输入的不是数字呢?他们的策略从一开始就被打破了。
相反,只有在我们确定用户输入的数字位于所需范围内时,才能放手。
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