bash,提示输入数字

bash,提示输入数字,bash,sed,while-loop,grep,Bash,Sed,While Loop,Grep,d是我使用的一个内部服务器查找工具 我希望允许用户输入0(或1)到9999(我们称之为userinput)之间的任何数字,并让它显示以下结果: d$userinput(例如1234) 然后操纵该查找的结果(下面将除去IP地址以外的所有内容,以便稍后ping): 我知道我需要用真实的时间;请务必阅读$blah等内容。我只是对read不够熟悉,无法将其正确格式化,更重要的是: 让它提示输入0-9999之间的数字读取命令本身不会提示。在实际显示提示之前,请使用正常的回声。使用echo-n不添加换行符。

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

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

d$userinput(例如1234)

然后操纵该查找的结果(下面将除去IP地址以外的所有内容,以便稍后ping):

我知道我需要用真实的时间;请务必阅读$blah等内容。我只是对read不够熟悉,无法将其正确格式化,更重要的是:


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

读取
命令本身不会提示。在实际显示提示之前,请使用正常的
回声。使用
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
$ wrapper.sh 1243

在第一次阅读时,我认为您的问题听起来非常适合包装器脚本,因此我建议:

$ 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"

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

相反,只有当我们确定用户输入的数字在想要的范围内时,才最好放手

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
如果要向用户解释脚本退出的原因,可以使用骰子函数:

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
die(){
($)&&printf>&2'%s\n'$@“
出口1
}
读取-ep“输入服务器编号:”编号
[[$number=~^[:digit:]+$]]||
骰子“***错误:您应该输入一个数字”
(((数字=(10#$number))=0))||
模具'***错误,编号不在0..9999'范围内
#在这里,我确信这个数字是一个范围为0..9999的有效数字

搜索“bash prompt for input”只会返回使用类似于这样的read的示例:read-p“Enter value”variable case“variable”在…我如何通过echo或从echo读取的引用进行提示。例如,@Zippyduda的
-p
选项是.Hm中不存在的扩展,这很公平。为什么在我发布的链接中使用它?@Zippyduda啊,我现在在中找到了它。它是一个特定于Bash的扩展。您尝试过吗?完美的编辑,非常感谢:)除此之外,我只需做d$userinput | grep。。。而且很有魅力。真的很有帮助,谢谢。
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() {
    (($#)) && 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