Bash – “if”语句的“和”运算符

我试图创build一个简单的bash脚本来检查网站是否closures,由于某些原因,“和”运算符不起作用:

#!/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 

很难说,因为你没有告诉我们你的剧本到底出了什么问题。

个人意见:绝不使用[[ 。 它不能移动到不同的shell。

尝试这个:

 if [ $STATUS -ne 200 -a "$STRING" != "$VALUE" ]; then 

引用:

“-a”运算符也不起作用:

如果[$ STATUS -ne 200] -a [[“$ STRING”!=“$ VALUE”]]

对于更详细的解释: []不是bash保留字。 if关键字引入了一个由作业评估的条件(如果作业的返回值为0则条件为真,否则为false)。

对于简单的testing,有test程序( man test )。

有些人会find像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" ]]将parsing为if +一些工作,除了if本身,工作就是一切。 这个工作只是一个简单的命令 (bash表示一个结果在一个进程中的东西),这意味着第一个单词( [ )是命令,其余的是其位置参数。 第一个之后还有其他的论点]

也不是, [[的确是一个bash关键字,但在这种情况下,它只被parsing为一个正常的命令参数,因为它不在命令的前面。

尝试这个:

 if [ $status -ne 100 -a "$STRING" = "$VALUE" ] 

要么

 if [ $status -ne 100 ] && [ "$STRING" = "$VALUE" ]