Bash: выполнение различных функций в зависимости от даты - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь создать скрипт bash, который при запуске запускает другой набор команд в зависимости от того, находится ли дата в определенном диапазоне. Меня интересует только день и месяц.

Например: допустим, я хочу сценарий, который сообщает мне сезон на основе европейского календаря. Я бы дал 4 абзаца кода в следующем формате:

if date is between 01-03 and 01-06 then
    echo "It is spring"
if date is between 01-06 and 01-09 then
    echo "It is summer"
if date is between 01-09 and 01-12 then
    echo "It is autumn"
if date is between 01-12 and 01-03 then
    echo "It is winter"

Это, безусловно, достижимо с помощью команды date. Я просто не уверен, как использовать числа месяца и дня в эффективной формуле для проверки таких диапазонов.

Ответы [ 4 ]

1 голос
/ 06 июня 2019

Использование оператора case для сопоставления с одной строкой, состоящей из месяца и даты в фиксированном формате.

case $((date +%m-%d)) in
  03-2[2-9]|03-3*|04|05|06-[01]*|06-2[012]) echo "spring" ;;
  06-2[2-9]|06-3*|07|08|09-[01]*|09-2[012])) echo "summer" ;;
  09-2[2-9]|09-3*|10|11|12-[01]*|12-2[012])) echo "autumn" ;;
  12-2[2-9]|12-3*|01|02|03-[01]*|03-2[012])) echo "winter" ;;
esac
1 голос
/ 06 июня 2019

date +%m указывает формат, в котором date будет выводиться только номер месяца, поэтому вы можете использовать его в своих условиях:

current_month=$(date +%m)
if [[ $current_month > 2 && $current_month < 6 ]]; then
    echo "It is spring"
...
0 голосов
/ 07 июня 2019

Вот гораздо более простой вариант ответа, который вы разместили:

read -r current_month current_day <<< $(date '+%B %d')

if (( current_day < 16 ))
then
    half=first
else
    half=second
fi

echo "$current_month, $half half"

Сегодняшняя продукция:

June, first half

Код формата %B предоставляет текущее полное название месяца местного жителя. Использование read для получения обоих значений одновременно позволяет избежать редкой проблемы получения дат разных месяцев ровно в полночь последнего дня месяца.

Этот сценарий удаляет много повторений , используя эту строку формата и фрагмент построения, чтобы строка выводилась.

Десять строк против ваших 103.

0 голосов
/ 06 июня 2019

Я обнаружил, что для того, что мне нужно, я могу просто оценить, будет ли это первая или вторая половина месяца.Мне удалось создать рабочий скрипт с помощью этой проверки:

current_month=$(date +%m)
current_day=$(date +%d)

if (( current_month == 1 )) && (( current_day < 16 ))
then
    # January, first half
    echo "January, first half"
elif (( current_month == 1 )) && (( current_day >= 16 ))
then
    # January, second half
    echo "January, second half"
elif (( current_month == 2 )) && (( current_day < 16 ))
then
    # February, first half
    echo "February, first half"
elif (( current_month == 2 )) && (( current_day >= 16 ))
then
    # February, second half
    echo "February, second half"
elif (( current_month == 3 )) && (( current_day < 16 ))
then
    # March, first half
    echo "March, first half"
elif (( current_month == 3 )) && (( current_day >= 16 ))
then
    # March, second half
    echo "March, second half"
elif (( current_month == 4 )) && (( current_day < 16 ))
then
    # April, first half
    echo "April, first half"
elif (( current_month == 4 )) && (( current_day >= 16 ))
then
    # April, second half
    echo "April, second half"
elif (( current_month == 5 )) && (( current_day < 16 ))
then
    # May, first half
    echo "May, first half"
elif (( current_month == 5 )) && (( current_day >= 16 ))
then
    # May, second half
    echo "May, second half"
elif (( current_month == 6 )) && (( current_day < 16 ))
then
    # June, first half
    echo "June, first half"
elif (( current_month == 6 )) && (( current_day >= 16 ))
then
    # June, second half
    echo "June, second half"
elif (( current_month == 7 )) && (( current_day < 16 ))
then
    # July, first half
    echo "July, first half"
elif (( current_month == 7 )) && (( current_day >= 16 ))
then
    # July, second half
    echo "July, second half"
elif (( current_month == 8 )) && (( current_day < 16 ))
then
    # August, first half
    echo "August, first half"
elif (( current_month == 8 )) && (( current_day >= 16 ))
then
    # August, second half
    echo "August, second half"
elif (( current_month == 9 )) && (( current_day < 16 ))
then
    # September, first half
    echo "September, first half"
elif (( current_month == 9 )) && (( current_day >= 16 ))
then
    # September, second half
    echo "September, second half"
elif (( current_month == 10 )) && (( current_day < 16 ))
then
    # October, first half
    echo "October, first half"
elif (( current_month == 10 )) && (( current_day >= 16 ))
then
    # October, second half
    echo "October, second half"
elif (( current_month == 11 )) && (( current_day < 16 ))
then
    # November, first half
    echo "November, first half"
elif (( current_month == 11 )) && (( current_day >= 16 ))
then
    # November, second half
    echo "November, second half"
elif (( current_month == 12 )) && (( current_day < 16 ))
then
    # December, first half
    echo "December, first half"
elif (( current_month == 12 )) && (( current_day >= 16 ))
then
    # December, second half
    echo "December, second half"
else
    # Error
    echo "Error: Invalid date"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...