我正在尝试制作一个脚本,当它等于 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
的名称与 0
或 1
(这将永远是不平等的)。
此脚本使用特定于 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/