Bash 测试网站状态的脚本,然后是 运行 命令

Bash script to test website status, then run command

我正在尝试编写一个非常基本的 bash 脚本,用于 linux 服务器上的 运行。我不确定为什么它不起作用。

目的是测试网站 returns 是否有 200 OK 响应。如果是,则退出。如果没有,则 运行 命令。

脚本是:

#!/bin/bash

if HEAD https://google.com | grep '200\ OK' | wc -l;  then
   echo "Site is up";
else
   sudo wo clean --all && sudo wo stack reload --all
fi

问题是,如果站点已启动,它会给出预期的输出。即...

1
Site is up

但是如果站点已关闭(假设我将 https://google.com 替换为 https://766google.com,我得到的输出是:

0
Site is up

我尝试了多种变体,包括将 HEAD ... 命令放入 [ ]

例如,我试过这个:

#!/bin/bash

if [ HEAD https://google.com | grep '200\ OK' | wc -l ];  then
   echo "Site is up";
else
   sudo wo clean --all && sudo wo stack reload --all
fi

但是当站点关闭时,它 运行s 所需的命令,但给出了一个错误......我得到这个输出:

./sitecheck.sh: line 3: [: missing `]'
wc: ]: No such file or directory
Cleaning NGINX FastCGI cache ... 
[THE OUTPUT OF COMMAND IT RUNS WHEN SITE IS DOWN]

有人能解释一下这个脚本有什么问题吗?

谢谢。

如果要统计输出的行数,需要用$(...)捕获流水线的输出,然后用((...))做算术比较。一组括号是输出捕获;两组算术。

if (($(HEAD https://google.com | grep '200 OK' | wc -l) > 0)); then
   echo "Site is up";
else
   sudo wo clean --all && sudo wo stack reload --all
fi

一个更简单的方法是使用 grep -qgrep -q 不需要输出匹配,而是直接 grep -q 指示是否找到匹配的成功或失败退出代码。

if HEAD https://google.com | grep -q '200 OK'; then
   echo "Site is up";
else
   sudo wo clean --all && sudo wo stack reload --all
fi