Календарь в проблемах программирования оболочки Linux - PullRequest
1 голос
/ 30 ноября 2011

Я хочу, чтобы мой календарь правильно обрабатывал месяцы с ведущими нулями, например: "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
$

1 Ответ

1 голос
/ 30 ноября 2011

Вы можете выполнить множественное сопоставление регулярных выражений в своем выражении case, т.е.

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

....

Иначе, вы можете использовать подстановку параметров оболочки для удаления любых ведущих нулей, т. Е.

# 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 г. Если вы запустили "cal 01", вы должны распечатать календарь на январь 2006 г.

Попробуйте это:

# 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} - это один из нескольких синтаксисов проверки параметров, предоставляемых большинством оболочек, который позволяет заменить значение по умолчанию, если значение var полностью не задано (не задано вообще) или = "". Таким образом, в этом случае, если y не был задан в командной строке, он будет отображаться как 0 в этой оценке, что позволит выполнить раздел && для проверки месяца и т. Д.

Вам нужно будет расширить обработку case $#, чтобы учесть 1 аргумент, который считается значением месяца.

Надеюсь, это поможет.

...