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" ]