Проблема: мне нужно проверить, не сегодня ли четверг, и выполнить различные действия в зависимости от результата этого условия. Я попробовал два разных подхода:
Получение названия дня:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
Начало дня Num:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
В обоих случаях выходной сигнал НЕТ, хотя он должен быть ДА. Что не так?
shell
shell-script
date
test
Swagatika
источник
источник
;
потребуются, если вы будетеthen
в одной строке сif
. В этом случае они являются избыточными.Ответы:
Проблема в пропущенном бланке.
Следующий код будет работать в оболочках,
[
встроенная команда которых принимает==
в качестве псевдонима=
:Но имейте в виду (см.
help test
Вbash
):==
официально не упоминается, вы должны использовать=
для сравнения строк-eq
предназначен для десятичных арифметических тестов (здесь ничего не изменится,date +%u
но будет,date +%d
например, когда дело доходит до сравнения04
и4
которые численно одинаковы, но лексически различны).Я бы предпочел:
Как правило, вы должны предпочесть подход числа дней , потому что он меньше зависит от текущей локали . На моей системе вывод
date +"%a"
сегодняDo
.источник
Не забывайте,
case
что часто это лучший способ сделать такие вещи:Также имейте в виду, что вывод
date +%a
зависит от локали, поэтому, если вы ожидаете английские имена, ваш скрипт перестанет работать при вызове, например, французским или корейским пользователем.Обратите внимание, что выше - один из редких случаев, когда
$(...)
это не нужно заключать в кавычки (хотя кавычки не повредят. То же, что и вvar="$(...)"
).источник
В той же идее я использую следующий фрагмент кода для «отключения» cron до выбранного часа.
Конечно, я бы предпочел изменить сам crontab ... если бы мне были предоставлены необходимые права :)
Вот простой тест, который прерывает скрипт bash, если мы не на ночь.
источник
/usr/bin/test
вместо встроенной[
команды оболочки ?cron
исполняемый файл в отличие от пользовательского crontab.-a
устарела вtest
. Как правило, вы будете использовать:hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ]
(илиhour=`date +%H`
если вам нужно быть совместимым с оболочкой Bourne, то есть Solaris 10 и старше, и, возможно, в настоящее время некоторые редкие подразделения SCO)Чтобы остановить скрипт в день недели, удалите только строку дня:
источник
if [ "$DAYOFWEEK" -lt 7 ]
лучше?Во-первых, вы должны заключить в кавычки DAYOFWEEK = "$ (date +% u)"
И вам нужно иметь пробелы с каждой стороны скобок [и].
Точка с запятой в конце строки является избыточной.
источник
a=$(echo 1 2 3); echo $a;
a=$(echo "1 2 3"); echo $a
с несколькими пробелами между цифрами (StackExchange, к сожалению, не позволит мне сделать это простым копированием и вставкой).