linux shell中日历编程问题
我希望我的日历能够正确处理带有前导零的月份 例如:“cal 01”或“cal 01 2012”
如何编写代码以使我的日历正确处理带有前导零的月份?
到目前为止,这是我的代码:
$ 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
$
I want my calendar to correctly handle months with leading zeros
for example: "cal 01" or "cal 01 2012"
How do I write the code to make my calendar to correctly handle months with leading zeros?
This is my code so far:
$ 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
$
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以在 case 语句中进行多个正则表达式匹配,即
否则,您可以使用 shell 参数替换来删除任何前导 0,即
编辑
对于您的后续问题
试试这个:
${y:-0}
是几个参数之一检查大多数 shell 提供的语法,如果 var 值完全未设置(根本没有设置)或 = "",则允许替换默认值。因此,在这种情况下,如果y
未由命令行设置,则在此评估中它将显示为 0,从而允许执行&&
部分测试月份等。您需要扩展
case $#
处理以允许 1 个参数,该参数被假定为月份值。我希望这有帮助。
You can do multiple regex matching in your case statement, i.e.
Else, you could use shell parameter substitution to remove any leading 0's, i.e.
Edit
For your follow-up question
Try this:
${y:-0}
is one of several parameter checking syntaxs provided by most shells that allows a default value to be substituted if the var value is completely unset (not set at all) or = "". So in this case, ify
wasn't set by the command line, it will appear as 0 in this evaluation, allowing the&&
section to be be executed to test the month, etc.You'll need to extend your
case $#
processing to allow for 1 argument, that is assumed to be a month value.I hope this helps.