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

时间:2012-11-16 00:14:12

标签: bash if-statement

我正在尝试创建一个简单的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" ]]

您还可以建议何时使用:

  • 单方括号和双方括号
  • 括号

4 个答案:

答案 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 filenameif [ -f filename ]基本相同(就产生的流程而言)。在这两种情况下,test程序都将启动,并且两个进程的行为应该相同。

这是你的错误:if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]将解析为if +某项工作,除了if本身之外,工作就是一切。这个工作只是一个简单的命令(bash代表导致单个进程的东西),这意味着第一个单词([)是命令,其余的是位置参数。 在第一个] 之后还有其他参数。

同样没有,[[确实是一个bash关键字,但在这种情况下,它只被解析为正常的命令参数,因为它不在命令的前面。