if语句总是为真,无论条件运算符如何

时间:2015-03-26 20:46:52

标签: bash variables if-statement conditional-statements

#!/bin/bash
WATCHDIR="/path/to/my/dir"
OKTIME="7200"
RESULTFILE="/path/to/some/file.tmp"
DONOTHING="$(printf 'good' > $RESULTFILE)"
SENDMAIL="$(printf 'bad' > $RESULTFILE)"
ELAPSEDTIME="$(expr $(date +%s) - $(stat -c %Y $WATCHDIR))"

if [ "$ELAPSEDTIME" -ge "$OKTIME" ]; then
     $SENDMAIL
else
     $DONOTHING
fi

我已经盯着这个太久了,我做了多次修改,将变量输出到单独的文件中以检查它们是否正常工作,以及今天在Bash中对条件语句的大量研究。出于某种原因,即使我手动验证SENDMAIL小于ELAPSEDTIME,脚本也会始终执行OKTIME

2 个答案:

答案 0 :(得分:3)

"$(printf 'good' > $RESULTFILE)"执行$()中的命令并将其替换为输出。

这意味着您始终执行:

printf 'good' > $RESULTFILE
printf 'bad' > $RESULTFILE

在你到达if语句之前。

请避免将命令放入变量中。如果需要函数,请使用函数:

#!/bin/bash
WATCHDIR="/mnt/remote/ian/test"
OKTIME="7200"
RESULTFILE="/mnt/remote/ian/result.tmp"
ELAPSEDTIME="$(expr $(date +%s) - $(stat -c %Y $WATCHDIR))"

donothing() { 
  printf 'good' > $RESULTFILE
}

sendmail() { 
  printf 'bad' > $RESULTFILE
}

if [ "$ELAPSEDTIME" -ge "$OKTIME" ]; then
     sendmail
else
     donothing
fi

答案 1 :(得分:0)

你的if语句没有错。问题是你要执行这两行:

DONOTHING="$(printf 'good' > $RESULTFILE)"
SENDMAIL="$(printf 'bad' > $RESULTFILE)"

首先将good写入文件,然后使用bad覆盖它。我认为你的意思是不要执行这些行的内容,直到后面的脚本:

DONOTHING="printf 'good' > $RESULTFILE"
SENDMAIL="printf 'bad' > $RESULTFILE"

尽管如此,使用变量存储代码对我来说似乎很奇怪。它会起作用,但为什么不这样做呢:

#!/bin/bash
WATCHDIR="/mnt/remote/ian/test"
OKTIME="7200"
RESULTFILE="/mnt/remote/ian/result.tmp"
ELAPSEDTIME="$(expr $(date +%s) - $(stat -c %Y $WATCHDIR))"

if [ "$ELAPSEDTIME" -ge "$OKTIME" ]; then
     printf 'bad' > "$RESULTFILE"
else
     printf 'good' > "$RESULTFILE"
fi