我正在尝试创建一个简单的bash脚本来检查网站是否已关闭,并且由于某种原因“and”运算符不起作用:
#!/usr/bin/env bash
WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.com"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"
if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi
“-a”运算符也不起作用:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
您还可以建议何时使用:
答案 0 :(得分:187)
除非${STATUS}
为空,否则您应该工作。这可能会更好:
if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then
或
if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then
很难说,因为你没有告诉我们你的剧本究竟出了什么问题。
个人意见:永远不要使用[[
。它不能移植到不同的外壳。
答案 1 :(得分:23)
试试这个:
if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
答案 2 :(得分:13)
试试这个:
if [ ${STATUS} -ne 100 -a "${STRING}" = "${VALUE}" ]
或
if [ ${STATUS} -ne 100 ] && [ "${STRING}" = "${VALUE}" ]
答案 3 :(得分:10)
引用:
“-a”运算符也不起作用:
如果[$ STATUS -ne 200] -a [[“$ STRING”!=“$ VALUE”]]
有关更详细的解释:[
和]
不是bash保留字。 if
关键字引入了一个由作业评估的条件(如果作业的返回值为0
,则条件为true,否则为false)。
对于琐碎的测试,有test
程序(man test
)。
由于有些人发现if test -f filename; then foo bar; fi
等行很烦人,在大多数系统上都会找到一个名为[
的程序,它实际上只是test
程序的符号链接。当test
被称为[
时,您必须添加]
作为最后的位置参数。
所以if test -f filename
与if [ -f filename ]
基本相同(就产生的流程而言)。在这两种情况下,test
程序都将启动,并且两个进程的行为应该相同。
这是你的错误:if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
将解析为if
+某项工作,除了if
本身之外,工作就是一切。这个工作只是一个简单的命令(bash代表导致单个进程的东西),这意味着第一个单词([
)是命令,其余的是位置参数。 在第一个]
之后还有其他参数。
同样没有,[[
确实是一个bash关键字,但在这种情况下,它只被解析为正常的命令参数,因为它不在命令的前面。