“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关键字,但在这种情况下,它只被解析为一个正常的命令参数,因为它不在命令的前面。

    链接地址: http://www.djcxy.com/p/97069.html

    上一篇: an "and" operator for "if" statement

    下一篇: Bash script if statements