#!/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
。
答案 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