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