linux - 将 cat 输出作为变量进行比较

标签 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

最佳答案

安全问题

你不应该在 /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

(我注意到除非中断,否则循环不会退出,因此循环后清理在这里是多余的,但通常您应该使用它来清理临时文件。)

关于linux - 将 cat 输出作为变量进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974895/

相关文章:

java - 无法写入 pty - linux

linux - 关于设置游戏的问题! linux服务器上的应用程序

bash - SoX:.wav 输入文件上的 EOF 过早

php - 使用 PHP 系统和 cURL 时出现权限问题?

linux - 关于 fork 和 execve 系统调用

regex - 使用 awk 查找和替换通过 find 找到的文件中的字符串

linux - 使用启用密码的 sudo 帐户更改 root 密码身份验证的脚本

azure - 如何在 Azure 上启用 Ping(ICMP)

linux - 如何通过 Linux ping 内部应用程序 url?

linux - grep ping 输出的持续时间