如何通过read命令解析sh中的cal输出?

我试图写一个脚本,该脚本将打印在指定的年的所有月份$3,有一天$1(例如钼,涂,...)在同一日期$2(1,2,3,...)。


示例:输入: ./task1.sh Tu 5 2006


输出:


September 2006

Mo Tu We Th Fr Sa Su

            1  2  3

4  5  6  7  8  9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30


December 2006

Mo Tu We Th Fr Sa Su

            1  2  3

4  5  6  7  8  9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30 31

我写了这个脚本:


#!/bin/sh

year=$3

dayInMonth=$2

dayInWeek=$1


index=1


while expr $index '!=' 13 >/dev/null; do

  cal -m $index $year| tail -n +2| while read Mo Tu We Th Fr Sa Su ; do

    eval theDay='$'$dayInWeek

    if [ "$theDay" = "$dayInMonth" ]; then

      cal -m $index $year;

    fi

  done

  index=$(expr $index + 1)

done

但是读取校准输出的第三行存在问题。在这些行中,天数通常不是从Mo地方开始的。如何可以解析CAL输出的第三行,因此号码$Mo,$Tu,$We,...总是正确的?


我需要POSIX标准友好解决方案。


胡子哥哥
浏览 292回答 2
2回答

慕妹3242003

使用命令检查日期更容易date。for month in {1..12}; do   if [[ $(date -d $(printf "%s-%2.2d-%2.2d" "$year" "$month" "$day") "+%a") == "Tue" ]]; then     cal -m $month $year;   fidone该脚本会循环12个月,并根据年份和日期生成日期。该date命令以3个字母的格式输出的日期+%a。如果要以数字格式表示星期几+%u,请== 2在if语句中使用和。
打开App,查看更多内容
随时随地看视频慕课网APP