Я полагаю, что только обозначает буквами, числа, и подчеркивание позволяется для переменных удара. Дело обстоит так на многих языках программирования (JavaScript, являющийся исключением).
Я рекомендую не иметь Вашего сценария, зависят от тех типов имен переменной.
На самом деле необходимо попытаться программировать таким способом, которым можно заменить имена переменной другими именами, и это не имеет значения. В целом имена переменной должны описать то, что содержит переменная. Это делает намного легче отладить; если бы не Вы, затем для следующего разработчика, который пытается выяснить код.
Действительно ужасный и вероятно работает только с GNU date
:
date -d "$( date -d "$( date +'%Y-01-01' ) +40 weeks") -$( date -d "$( date +'%Y-01-01' ) +40 weeks" +'%w' ) days+1 day" +'%Y-%m-%d'
Протестированный только на Ваш 3 октября пример, может перестать работать для некоторых других случаев.
Обновление: Если у Вас есть не локаль инженера, необходимо указать вывод с внутренней даты для получения до работать. (И %F просто является YYYY-MM-DD).
date -d "$(date -d "$(date +'%Y-01-01') +40 weeks" +"%F") -$(date -d "$(date +'%Y-01-01') +40 weeks" +%w) days +1 day" +"%F"
Альтернативный подход:
date --date "+$((40-$(date +%V)))weeks last monday" +"%F"
date +%V
возвраты 41
), затем --date
значение параметра будет +-1weeks last monday
, который является на самом деле две недели назад, не 7 дней назад.
– Adam Spiers
02.09.2013, 14:09
date -d 'last monday'
. Вчера это возвратится. Что Вы думаете, что это сказало бы, выполнили ли Вы вчера его?
– Adam Spiers
03.09.2013, 16:38
Хорошо, вот моя попытка. Это крадет идеи из других ответов и пытается сделать логику легче следовать. Это основано на системе ISO 8601, таким образом, это не будет корректно, если Вы будете жить в странах, таких как США или Канада, но должны будете быть легко корректируемыми для тех стран.
# sets $week_start to a representation of Monday of the given week
# number formatted via the given format, and similarly sets
# $week_end to Friday of the same week.
get_week_range () {
week_num="$1" date_format="$2"
# Most of the world adhere to ISO 8601 which states that weeks begin on Monday
# and Jan 4th is always in week #1:
#
# http://en.wikipedia.org/wiki/ISO_week_date
#
# For other week numbering systems (e.g. USA, Canada), see:
#
# http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
day_in_week_1=$( date +'%Y-01-04' )
day_num_in_week_1=$( date -d $day_in_week_1 +%u ) # 1 is Monday
days_from_week_1_start=$(( $day_num_in_week_1 - 1 ))
# This is a Monday:
start_of_week_1=$( date -d "$day_in_week_1 - $days_from_week_1_start days" +%F )
week_delta="$(( $week_num - 1 ))"
# Monday:
week_start=$( date -d "$start_of_week_1 + $week_delta weeks" +"$date_format" )
# Friday:
week_end=$( date -d "$start_of_week_1 + $week_delta weeks + 4 days" +"$date_format" )
}