通過Shell判斷某個日期是星期幾


一個朋友有如下的備份需求:

1. RMAN備份片統一存放在/datafile/這個路徑下
2. 然后每周六歸檔備份完畢后,把上周日到本周六的備份文件統一cp到一個目錄下(/datafile/tarfile),然后把這個目錄gtar壓縮打包,以當天日期命名比如:prod_yyyymmdd.tar.gz 
3. 把prod_yyyymmdd.tar.gz傳到備份服務器,將/datafile/tarfile/下面的文件清空;
4. 定期將/datafile/下面備份成功的文件(/datafile/目錄只保留一個月以內的備份片)

但是有個問題卡住了,如何判斷某個日期是星期幾? 我覺得通過這個方法去操作,不太方便,寫法也比較復雜;先不考慮rman的備份思路,下面我們解決這個問題

-----------------------------------------------------------------------------------------

有兩種方法:
1.通過date命令獲取,獲取結果:0為星期日,1-6為星期一至星期六。
date +%w 取得當天是星期幾
date -d 20120311 +%w 取得2012年3月11日是星期幾

image

2.通過腳本獲取
vim c_test.sh 創建腳本,輸入以下所貼出的代碼
chmod +x c_test.sh 給予腳本執行權限
./c_test.sh 20120311 取得2012年3月11日是星期幾

以下是該腳本的代碼(其實通過這個腳本我們就可以看出從日期獲取星期幾的計算方法了):

 

#!/bin/bash
# SAVE THIS CODE AS c_test.sh
#
# Uses Zellers Congruence calculation to use a date and give
# the day of the week that date was.
#
# This function expects 1 Arguments,
# YYYYMMDD
# example:20120311
# then
# Returns a value between 0 and 6 to represent the day of the
# week where 0=Sun,1=Mon,...6=Sat
#
# e.g c_test.sh 20120311
#
# This formula is Year 2000 compliant.
# It is not compliant using dates previous to Oct 1752

#
export YMD=$1
export YEAR=`echo $YMD|cut -c0-4`
export MONTH=`echo $YMD|cut -c5-6`
export DAY=`echo $YMD|cut -c7-9`

# Adjust Month such that March becomes 1 month of
# year and Jan/Feb become 11/12 of previous year
# =============================================

if [ $MONTH -ge 3 ];then
MONTH=`expr $MONTH - 2`
else
MONTH=`expr $MONTH + 10`
fi

if [ $MONTH -eq 11 ] || [ $MONTH -eq 12 ] ; then
YEAR=`expr $YEAR - 1`
fi
# ==============================================

# Split YEAR into YEAR and CENTURY
# ================================
CENTURY=`expr $YEAR / 100`
YEAR=`expr $YEAR % 100`
# ================================

# Black Magic Time
# ================
#Z=(( 26*$MONTH - 2 ) / 10) + $DAY + $YEAR + ( $YEAR/4 ) + ( $CENTURY/4 ) - (2 * $CENTURY) + 77) % 7
Z=`expr \( $MONTH \* 26 - 2 \) / 10`
Z=`expr $Z + $DAY + $YEAR`
Z=`expr $Z + $YEAR / 4`
Z=`expr $Z + $CENTURY / 4`
Z=`expr $Z - $CENTURY - $CENTURY + 77`
Z=`expr $Z % 7`
if [ $Z -lt 0 ] ; then
Z=`expr $Z + 7`
fi
# ================

echo $Z
# Sun 0
# Mon 1
# Tue 2
# Wed 3
# Thu 4
# Fri 5
# Sat 6
# ========================

最后,想特別提醒一點的是,如果是采用crontab計划任務的方式來調用某個腳本執行,並希望在指定的星期幾運行的話,直接通過crontab -e修改最后一個 * 號就可以實現,同樣是0為星期天,1-6分別為星期一到星期六,不必勞神費力在腳本中判斷當天是星期幾了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM