将猫输出作为变量进行比较

时间:2014-05-31 22:08:09

标签: linux bash ping

我正在尝试创建一个脚本,当它等于1时,它会比较/ results文件的输出。

#!/bin/sh

RESULTS=/results
$
while true
do
ping -c 5 1.1.1.1 > /dev/null && echo "1" > /results  || echo "0" > /results
if

         [ $RESULTS = "1" ];
then
        echo "working"
        sleep 5
else

        echo "not working"
        sleep 5
fi

done

4 个答案:

答案 0 :(得分:3)

安全问题

你不应该在/results中写任何东西。如果可以,您应该避免以用户root运行任何内容,如果您不是用户root,则不应该在根目录中乱涂乱画。

方法问题

你正试图测试ping是否(非常)努力。使用:

while true
do
    if ping -c 5 1.1.1.1 > /dev/null
    then echo "working"
    else echo "not working"
    fi
    sleep 5
done

您可能也希望为邮件添加时间戳;它比计数更容易。因此:

while true
do
    if ping -c 5 1.1.1.1 > /dev/null
    then date "+%Y-%m-%d %H:%M:%S - working"
    else date "+%Y-%m-%d %H:%M:%S - not working"
    fi
    sleep 5
done

请注意,此技术可避免临时文件,因此无需清理任何内容。这是更好的脚本技术。尽可能避免使用临时文件。如果无法避免临时文件,请确保清理它们。

让您的技术发挥作用

不要忘记始终使用$RESULTS。我还将文件重新定位到“更好”的位置,并合理地确定它将被清理。如果root的主目录为/(传统值)而不是/home/root或类似内容,请考虑使用其他“更好”的位置,例如/tmp/root/results.$$(创建首先是/tmp/root目录:mkdir -p /tmp/root)。

您需要将$RESULTS的内容与字符串进行比较,而不是将$RESULTS的名称与01(始终不相等)进行比较。

此脚本使用特定于Bash的表示法($(<file)表示法读取文件):

RESULTS=$HOME/results.$$
trap "rm -f $RESULTS; exit 1" 0 1 2 3 13 15

while true
do
    ping -c 5 1.1.1.1 > /dev/null && echo "1" > $RESULTS  || echo "0" > $RESULTS
    if [ $(<$RESULTS) = "1" ];
    then echo "working"
    else echo "not working"
    fi
    sleep 5
done

rm -f $RESULTS
trap 0

或(不限于Bash):

RESULTS=$HOME/results.$$
trap "rm -f $RESULTS; exit 1" 0 1 2 3 13 15

while true
do
    ping -c 5 1.1.1.1 > /dev/null && echo "1" > $RESULTS  || echo "0" > $RESULTS
    if [ $(cat $RESULTS) = "1" ];
    then echo "working"
    else echo "not working"
    fi
    sleep 5
done

rm -f $RESULTS
trap 0

(我注意到循环不会退出,除非被中断,所以这里的循环后清理是多余的,但是你应该使用它来清理临时文件。)

答案 1 :(得分:0)

由于您需要阅读其名称包含在变量RESULTS中的文件的内容,因此表达式

[ $RESULTS = "1" ]

必须更改为

[ $(cat $RESULTS) = "1" ]

答案 2 :(得分:0)

您的变量RESULTS始终保留/results,因此[ $RESULTS = "1" ]失败,因为RESULTS永远不会"1"。您需要将RESULTS中存储路径的文件的内容"1"进行比较;即使用$(cat $RESULTS) = "1"

答案 3 :(得分:0)

其他的回答者提出了很好的脚本替代方案,但我认为完成您要做的事情的最简单方法是使用watch,它安装在大多数(所有?)Linux发行版上。你可以这样做:

watch 'ping -c 5 2>&1 >/dev/null && echo "success" || echo "failure"'

Jonathan Leffler的解决方案也非常好,但是如果您需要重用命令的退出代码,$?变量始终包含上一个命令的退出代码。您可以将其存储到另一个变量并保存以供日后使用。