Zip*_*uda 2 bash grep sed while-loop
d 是我使用的内部服务器查找工具。
我希望允许用户输入 0(或 1)到 9999 之间的任何数字(我们称之为用户输入)并让它显示结果:
d $userinput(例如1234)
然后操纵该查找的结果(下面删除了除稍后要 ping 的 IP 地址之外的所有内容):
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]?)'`
Run Code Online (Sandbox Code Playgroud)
我知道我需要使用 while true; 我只是不熟悉如何正确地格式化它,更重要的是:
让它提示输入 0-9999 之间的数字
其他答案有很多缺陷,因为它们检查用户是否输入了超出他们想要的范围的数字。但是如果用户输入的不是数字怎么办?他们的策略从一开始就被打破了。
相反,最好仅当我们确定用户输入的数字位于所需范围内时才放手。
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
Run Code Online (Sandbox Code Playgroud)
正则表达式[[ $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
Run Code Online (Sandbox Code Playgroud)
如果您想向用户解释脚本退出的原因,可以使用 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6312 次 |
| 最近记录: |