“if”语句的“和”运算符
我试图创建一个简单的bash脚本来检查网站是否关闭,由于某种原因,“和”操作符不起作用:
#!/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" ]]
你能否也请告知何时使用:
你有什么应该工作,除非$STATUS
是空的。 这样做可能会更好:
if ! [ "$STATUS" -eq 200 ] 2> /dev/null && [ "$STRING" != "$VALUE" ]; then
要么
if [ "$STATUS" != 200 ] && [ "$STRING" != "$VALUE" ]; then
很难说,因为你没有告诉我们你的剧本到底出了什么问题。
个人意见:绝不使用[[
。 它不能移动到不同的外壳。
尝试这个:
if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then
引用:
“-a”运算符也不起作用:
如果[$ STATUS -ne 200] -a [[“$ STRING”!=“$ VALUE”]]
对于更详细的解释: [
和]
不是bash保留字。 if
关键字引入了一个由作业评估的条件(如果作业的返回值为0
则条件为真,否则为false)。
对于琐碎的测试,有test
程序( man test
)。
有些人会发现像if test -f filename; then foo bar; fi
if test -f filename; then foo bar; fi
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关键字,但在这种情况下,它只被解析为一个正常的命令参数,因为它不在命令的前面。