使用Bash脚本中的换行符读取粘贴的输入

时间:2014-07-07 09:04:05

标签: bash scripting

我已经尝试了几个晚上让这个脚本运行而没有运气。我尝试使用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检查将成功,但是该行之后的所有文本都将吐出到以下文本中命令提示符。所以我的问题似乎在于我从用户输入中读取的内容。正在阅读的唯一部分是第一行,一旦遇到中断,脚本就不会考虑其工作中第一行之外的任何行。

1 个答案:

答案 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