脚本:
curl -s http://api.ipify.org > ~/ip.txt && [[ -s ~/ip.txt ]] && ip=$(cat ip.txt) && echo $ip > ~/newIP.txt || echo WAN IP is blank: curl, latency or internet issue
# logger -s WAN IP is blank: curl, latency or internet issue
脚本最多运行至:
curl -s http://api.ipify.org > ~/ip.txt && [[ -s ~/ip.txt ]] && ip=$(cat ip.txt)
另一部分被忽略,但是当我从终端手动 sh 脚本时,它可以正确执行。
我做错什么了吗?
答案1
这可能是个人喜好问题,但我个人认为这些u > v && w && x > y || z
单行代码难以理解,尤其难以调试。如果它们能正常工作,那就没问题,但除此之外,在我看来,它们就是个麻烦事。
在您的情况下,错误在于ip=$(cat ip.txt)
部分原因,因为 cronjobs 可能将当前工作目录设置为 $HOME,也可能没有。前面的代码… > ~/ip.txt
将文件写入您的 $HOME,但后面的代码cat ip.txt
尝试ip.txt
从
cat
启动目录的任何位置访问该文件。简单的修复方法是用
cat ip.txt
替换cat ~/ip.txt
。
话虽如此,我建议如下:
#!/usr/bin/env bash
if ip=$(curl -s -f http://api.ipify.org); then
echo "$ip" > ~/newIP.txt
else
echo "WAN IP is blank: curl, latency or internet issue"
fi
如果无法访问给定站点,则这依赖于curl
返回错误退出值 (!=0)。如果不是这种情况,请将代码更改为:
ip=$(curl -s -f http://api.ipify.org);
if [ "$ip" ]; then
…