我已经尝试了几个晚上让这个脚本运行而没有运气。我尝试使用Bash编写脚本,允许用户粘贴文本块,脚本将从文本中删除有效的IP地址,并按顺序自动ping它们。
到目前为止,经过多次修改后,我仍然坚持这一点:
#!/bin/sh
echo Paste Text with IP Addresses
read inputtext
echo "$inputtext">inputtext.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" inputtext.txt > address.txt
awk '{print $1}' < address.txt | while read ip; do
if ping -c1 $ip >/dev/null 2>&1; then
echo $ip IS UP
else
echo $ip IS DOWN
fi
done
rm inputtext.txt
rm address.txt
运行此脚本后,系统会根据需要提示用户,如果第一行文本中包含IP地址,则ping检查将成功,但是该行之后的所有文本都将吐出到以下文本中命令提示符。所以我的问题似乎在于我从用户输入中读取的内容。正在阅读的唯一部分是第一行,一旦遇到中断,脚本就不会考虑其工作中第一行之外的任何行。
答案 0 :(得分:0)
如上所述,您只需要一个外部循环来实际读取每行用户输入。
#!/bin/sh
echo Paste Text with IP Addresses
while read -r inputtext
do
echo "$inputtext">inputtext.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" inputtext.txt > address.txt
awk '{print $1}' < address.txt | while read ip; do
if ping -c1 $ip >/dev/null 2>&1; then
echo $ip IS UP
else
echo $ip IS DOWN
fi
done
rm inputtext.txt
rm address.txt
done
但是,您实际上可以进一步简化这一过程并消除临时文件。
#!/bin/sh
echo Paste Text with IP Addresses
while read -r inputtext
do
ip=$(echo "$inputtext" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | awk '{print $1}')
if ping -c1 $ip >/dev/null 2>&1; then
echo $ip IS UP
else
echo $ip IS DOWN
fi
done