Unix で、特定の月と年の最後の土曜日の日付 (月の日) を見つけたいと考えています。cal
特定の月/年のカレンダーが表示されることを知っています。最後の土曜日を取得する良い方法は何ですか?
更新: 任意の曜日に適用できるソリューションが欲しいです。たとえば、同じ方法を使用して、先週の日曜日または水曜日の日付も見つけることができます。
そのために awk を使用します。このことを考慮:
cal 5 2013 | awk 'NF>6{a=$7} END{print a}'
25
cal
出力を単にパイプ/解析したくない場合は、アルゴリズムを使用して date の曜日を決定し、 12 月 31 日の曜日を取得して、土曜日にするのに必要な日数を遡ることができます。
しかし、 cal の解析はおそらくもっと簡単です。
この質問には別の答えがあります。これは少し長い Bash スクリプトであり、あまり効率的ではありませんが、理解しやすいものです。基本的な考え方は、指定された月と年の 22 日から 31 日までをループし、これらの各日の曜日を で確認することdate +'%u'
です。これが希望する曜日を返す最後の日 (例: 土曜日) は変数RESULT_DAY
に格納され、ループ後の結果が含まれます。
#!/bin/bash
DAY_OF_WEEK=6 # 1=Monday, ..., 7=Sunday
THE_YEAR=2016
THE_MONTH=10
RESULT_DAY=0
YEAR_MONTH_STR=${THE_YEAR}"-"${THE_MONTH} # Example value: "2016-10"
for DAYNO in 22 23 24 25 26 27 28 29 30 31
do
DATE_TO_CHECK=${YEAR_MONTH_STR}"-"${DAYNO}
DATE_RESULT=$(date --date=$DATE_TO_CHECK '+%u')
if [ $? -eq 0 ]
then
if [ $DATE_RESULT -eq $DAY_OF_WEEK ]
then
RESULT_DAY=$DAYNO
fi
fi
done
RESULT_DATE_COMPLETE=${YEAR_MONTH_STR}"-"${RESULT_DAY}
echo -e "\nResult date (YYYY-MM-DD): "$(date --date=$RESULT_DATE_COMPLETE +'%Y-%m-%d (%A)')
値"0"をチェックすることでdate
の結果コードをチェックするため、不正な日 (たとえば、存在しない 2 月 31 日) を無視できます。$?
月の 22 日は、考慮しなければならない最も早い日付です。これは、最も短い月 (うるう年以外の 2 月) では、土曜日などの最後の発生の最も早い日だからです。