2011-11-29 28 views
1

我想我的日曆正確處理個月的前導零 例如:「CAL 01」或「CAL 01 2012」日曆在Linux shell編程問題

我怎樣寫代碼,使我的日曆正確處理領先零的月份?

這是我到目前爲止的代碼:

$ cat cal 
#cal: nicer interface to /usr/bin/cal 

case $# in 
0) set 'data';m=$2; y=$6 ;; # no argu: use today 
1) m=$1; set 'data'; y=$6 ;; # 1 rg: use this year 
*) m=$1; y=$2 ;;   # 2 ags: month and year 
esac 

case $m in 
jan*|Jan*) m=1 ;; 
feb*|Feb*) m=2 ;; 
mar*|Mar*) m=3 ;; 
apr*|Apr*) m=4 ;; 
may*|May*) m=5 ;; 
jun*|Jun*) m=6 ;; 
jul*|Jul*) m=7 ;; 
aug*|Aug*) m=8 ;; 
sep*|Sep*) m=9 ;; 
oct*|Oct*) m=10 ;; 
nov*|Nov*) m=11 ;; 
dec*|Dec*) m=12 ;; 
[1-9]|10|11|12) ;;   # numeric month 
*)  y=$m; m="" ;;  # plain year 
esac 

/usr/bin/cal $m $y   # run the real one 
$ 
+1

你的問題到底是什麼?我沒有看到有人被問到。 –

+1

請修改您的帖子以添加問題或提供更多信息,而不是撰寫評論。謝謝。 –

+0

好吧,我把它放在帖子中。 – user977154

回答

1

你可以在你的case語句做多的正則表達式匹配,即

case $m in 
01|1|jan*|Jan*) m=1 ;; 
02|2|feb*|Feb*) m=2 ;; 

.... 

否則,你可以使用shell參數替換,以消除任何一位的0 ,即

# as a way to demonstrate param sub on $1 etc, load values to $1 and $2 
set -- 01 02 
echo ${1#0} 
echo ${2#0} 

# output 
1 
2 

編輯

對於您的後續問題

例如,當前月份是2005年11月,如果你運行 「CAL 01」,你應該打印出2006年01月

日曆嘗試:

# if the month input is less than the current month, assume the next year 
if ((${y:-0} == 0 && m < $(/bin/date +%m))) ; then 
    y=$(/bin/date +%Y) 
    ((y++)) 
fi 

${y:-0}是由最殼提供了若干參數檢查syntaxs的一個允許的默認值被如果第取代e var value完全未設置(根本不設置)或=「」。因此,在這種情況下,如果命令行未設置y,則在此評估中它將顯示爲0,允許執行&&部分以測試月份等。

您需要延長您的case $#處理允許1個參數,即假定爲月份值。

我希望這會有所幫助。

+0

我該如何檢查月份是否是當年,如果是,那麼就在下一年將它打印出來。例如,當前月份是2005年11月,如果您運行「cal 01」,那麼您應該打印2006年1月的日曆。 – user977154

+0

因此,如果月份值小於當前月份,則假設下一年?我現在必須出去,但稍後會編輯,如果這是你想要的。感謝您的複選標記! – shellter

+0

@ user977154:根據您的要求,查看我添加的其他信息。祝你好運。 – shellter