【问题标题】:Calendar in linux shell programming problemslinux shell编程中的日历问题
【发布时间】:2011-11-29 21:29:24
【问题描述】:

我希望我的日历能够正确处理带有前导零的月份 例如:“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
$

【问题讨论】:

  • 您的问题到底是什么?我没有看到有人问。
  • 请编辑您的帖子以添加问题或提供更多信息,而不是编写 cmets。谢谢。
  • 好吧,我把它放在帖子里了。

标签: linux shell ubuntu cat


【解决方案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 年 1 月的日历

试试这个:

# 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} 是大多数 shell 提供的几种参数检查语法之一,如果 var 值完全未设置(根本未设置)或 = "",则允许替换默认值。所以在这种情况下,如果y不是由命令行设置的,它会在这个评估中显示为0,允许执行&amp;&amp;部分来测试月份等。

您需要扩展您的 case $# 处理以允许 1 个参数,即假定为月份值。

我希望这会有所帮助。

【讨论】:

  • 我如何检查过去的月份是否是当年,如果是,则在下一年打印出该月。例如,当前月份是 2005 年 11 月,如果你运行“cal 01”,你应该打印出2006年1月的日历。
  • 那么如果月份值小于当前月份,假设下一年?我现在必须出去,但稍后会编辑,如果这是你想要的。感谢您的勾选!
  • @user977154 :根据您的要求查看我添加的其他信息。祝你好运。
  • 是的,这正是我想要的,非常感谢您的帮助。
  • 我知道您已经回答了我的很多问题,但我想知道如何更改输入的年份和月份?所以我可以测试我的其他测试用例。
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多