Нам просто нужно вычесть текущий день (сегодня день $ td
) из ожидаемого выбранного PayDay.
Если PayDay больше нынешнего, результат будет положительным и правильным.
Например, td = 8 и pd = 15:
$ td=8; pd=15
$ echo "The next PayDay will be in $((pd-td)) days"
7
Если результат отрицательный, мы просто добавляем количество дней текущего месяца.
Это может быть сценарий:
#!/bin/bash
pd=${1:-10} # Pay day selected
td=$( date -u +'%-d' ) # Today day of the month.
# To calculate the number of days in the present month.
MonthDays=$( date +'%-d' -ud "$(date +"%Y-%m-01T00:00:00UTC") next month last day" )
# Maybe a simpler alternative for current month last day:
# echo $(cal) | awk '{print $NF}' # $(cal) is unquoted on purpose.
# Make the next PayDay fit within the available days in the month.
# If the selected PayDay given to the script is 31 and the month
# only has 30 days, the next PayDay should be 30,
# not an un-existent and impossible 31.
pd=$(( (pd>MonthDays)?MonthDays:pd ))
res=$(( pd-td ))
# If the value of res is negative, just add the number of days in present month.
echo "Pay Day is in $(( res+=(res<0)?MonthDays:0 )) days"
Обратите внимание, что уникальная команда date
должна использовать только текущий месяц, поэтому границы месяца / года не пересекались. Это позволяет избежать почти всех проблем. Единственное предположение состоит в том, что текущий месяц начинается с числа 01
. Кроме того, расчет выполняется в UTC + 0, что позволяет избежать возможных проблем с DST (летнее время) или локальными изменениями.
Если выбранный PayDay (скажем, 31) больше, чем возможное количество дней в месяце (скажем, февраль с 28), программа предполагает, что такое 28 является PayDay, а не несуществующим (для февраля) 31.
Вызов сценария (если сегодня день 9):
$ ./script 7
Pay Day is in 29 days
$ ./script 16
Pay Day is in 7 days
$ ./script 31
Pay Day is in 19 days
Но если сегодня день 28 февраля:
$ ./script 8
Pay Day is in 8 days
$ ./script 28
Pay Day is in 0 days
$ ./script 31
Pay Day is in 0 days
Двойные кавычки в вашем случае являются проблемой в скрипте expect
.
spawn sh -c "ssh IPaddress "./bin/show_info.py |.. sed 's/total.*//g'" > Report_2017.txt"
Просто обратите внимание, что из-за двойных кавычек, оканчивающихся после IP-адреса, канал остается открытым.
Вы можете попробовать это:
spawn sh -c "ssh IPaddress \"./bin/show_info.py |.. sed 's/total.*//g'\" > Report_2017.txt"