2010-06-14 3 views
2

Я задал вопрос раньше. Ответ имел смысл, но я никогда не смог заставить его работать. И теперь я должен заставить его работать. Но я не могу понять утверждения BASH if. Что я делаю неправильно ниже:BASH если условия

START_TIME=9 
STOP_TIME=17 
HOUR=$((`date +"%k"`)) 
if [[ "$HOUR" -ge "9" ]] && [[ "$HOUR" -le "17" ]] && [[ "$2" != "-force" ]] ; then 
    echo "Cannot run this script without -force at this time" 
    exit 1 
fi 

Идея заключается в том, что я не хочу этот скрипт, чтобы продолжить выполнение, если не приходится, в течение часа с 9 утра до 5 вечера. Но он всегда будет оценивать условие true и, таким образом, не позволит мне запускать скрипт.

./script.sh [действие] (-force)

Thx

Редактировать: Выход множества -x:

$ ./test2.sh restart 
+ START_TIME=9 
+ STOP_TIME=17 
++ date +%k 
+ HOUR=11 
+ [[ 11 -ge 9 ]] 
+ [[ 11 -le 17 ]] 
+ [[ '' != \-\f\o\r\c\e ]] 
+ echo 'Cannot run this script without -force at this time' 
Cannot run this script without -force at this time 
+ exit 1 

, а затем с -Force

$ ./test2.sh restart -force 
+ START_TIME=9 
+ STOP_TIME=17 
++ date +%k 
+ HOUR=11 
+ [[ 11 -ge 9 ]] 
+ [[ 11 -le 17 ]] 
+ [[ '' != \-\f\o\r\c\e ]] 
+ echo 'Cannot run this script without -force at this time' 
Cannot run this script without -force at this time 
+ exit 1 
+0

Какую версию Баш вы используете? Он отлично работает на моем: 3.2.49. –

+0

Это GNU bash, версия 3.2.39 (1) -release (i686-pc-linux-gnu). Я чувствую себя очень глупо, что вышеупомянутое не сработает. Всегда переходит в режим ошибок. Не знаю, почему. – Daniil

+0

«Режим ошибки» - Что вы подразумеваете под этим? Есть ли сообщение об ошибке? –

ответ

0
#!/bin/bash 
START_TIME=9 
STOP_TIME=17 
HOUR=$(date +"%k") 
if (($HOUR >= $START_TIME && $HOUR <= $STOP_TIME)) && [[ "$2" != "-force" ]] ; then 
    echo "Cannot run this script without -force at this time" 
    exit 1 
fi 
+0

Обратите внимание, что если параметр STOP_TIME равен 17, это предотвратит выполнение скрипта до 17:59. Вам может потребоваться изменить это, если вы хотите иметь возможность запускать его в течение интервала 17: 00-17: 59 (включительно) или проверить часы и минуты для большей точности. –

+0

OK - кажется, работает. Да, я не хочу, чтобы этот скрипт исполнялся до 18:00, следовательно <= 17. Большое спасибо! Но можете ли вы объяснить, что я делаю неправильно? Просто чувствую себя очень глупо, что не может понять, что кажется самой простой задачей. – Daniil

+0

Я не вижу причин, почему ваша версия не работает. Добавьте 'set -x' прямо перед этим разделом и' set + x' справа после и отредактируйте свой вопрос, чтобы показать результат. –

0

Использование -a вместо & &:

if [ $HOUR -ge $START_TIME -a $HOUR -le $STOP_TIME -a "_$2" != "_-force" ]; then 
    echo "Cannot run without -force at this hour" 
    exit 1 
fi 
+0

Ваш код в порядке, так как все значения известны, контролируются или охраняются, но в целом лучше использовать либо '[[... -a ...]], либо' [...] && [...] '. См. Раздел «Применение приложения» в [Спецификация POSIX для * теста *] (http://www.opengroup.org/onlinepubs/009695399/utilities/test.html). Проблема заключается в том, что '[...]' могут быть смущены значениями, которые выглядят как операторы, поскольку они анализируют для операторов после расширения (поскольку первоначально это была внешняя команда), но '[[...]]' может анализировать для операторов до (поскольку он определен как встроенный в оболочки, которые его поддерживают). –

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