if 语句始终为真,而不考虑条件运算符


#!/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 中的条件语句进行了大量研究。出于某种原因,即使我手动验证了ELAPSEDTIME小于 OKTIME,脚本也总是执行SENDMAIL

"$(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

你的 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

最新更新