2015-03-26 3 views
0
#!/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 

Я слишком долго смотрел на это, я сделал несколько ревизий, вывел переменную в отдельные файлы, чтобы проверить, что они работают, и много исследований условных в Баше сегодня. По какой-то причине сценарий всегда выполняет SENDMAIL, даже когда я вручную проверил, что ELAPSEDTIME меньше, чем OKTIME.если утверждение всегда верно независимо от условного оператора

ответ

3

"$(printf 'good' > $RESULTFILE)" выполняет команду в $() и заменяет его на выходе.

Это означает, что вы всегда выполнять:

printf 'good' > $RESULTFILE 
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))" 

donothing() { 
    printf 'good' > $RESULTFILE 
} 

sendmail() { 
    printf 'bad' > $RESULTFILE 
} 

if [ "$ELAPSEDTIME" -ge "$OKTIME" ]; then 
    sendmail 
else 
    donothing 
fi 
+0

Спасибо, это будет мой первый скрипт для использования функций. Я читаю случайные вопросы здесь, проверяя страницы с людьми и выполняя поисковые запросы Google - спасибо за ответ, я, очевидно, должен продолжать учиться. – snowexcuse

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 
+2

'' 'Будут рассматриваться буквально, поэтому сохранение этого кода в переменных не будет работать. –

+0

@thatotherguy Хорошая точка. – Paulpro

Смежные вопросы