无论条件运算符如何,if 语句始终为真

if statement always true regardless of conditional operator

#!/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

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

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