无论条件运算符如何,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
#!/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