Linux、改进的 cal、shell 编程

发布于 2024-12-19 02:41:00 字数 985 浏览 1 评论 0原文

我正在与加州大学一起完成一项家庭作业,但我被困在一个问题上。

不太可能有人真正对获得公历感兴趣 一世纪的一年的日历,当时公历 日历甚至不存在。使用“窗口”策略让您 新的 cal 可以处理非完整 4 位数年份的年份。如果 年的范围为 0 <= 年 <= 50,假设该年确实是 2000-2050。如果年份在 51 <= Year <= 99 范围内,则假设 年份实际上是 1951-1999 年。

文件名为改进的cal.sh 例如,使用 sh Improvedcal.sh 1 2011 调用 shell 代码

case $# in 

# rando stuff

*) m=$1; y=$2 ; # 2 ags: month and year
if ((y >= 0 && y <= 50)); then  
y+=2000
elif ((y >= 51 && y <= 99)); then
y+=1900
fi;;
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
0[1-9]|010|011|012) ;; # numeric month
# *) y=$m; m="" ;; # plain year
esac

/usr/bin/cal $m $y # run cal with new inputs

但这由于某种原因不起作用,有人对我有任何指示吗? 由于某种原因,它只是跳过了这一部分。

I am working with cal for a homework assignment and i am stuck on one point.

It is unlikely that anyone is really interested in getting a gregorian
calendar for a year in the first century, a time when the gregorian
calendar didn't even exist. Use the "windowing" strategy to allow your
new cal to handle years that are not the full 4 digit year. If the
year is in the range of 0 <= year <= 50, assume the year is really
2000-2050. If the year is in the range 51 <= year <= 99, assume the
year is really 1951-1999.

file named improvedcal.sh
call the shell with sh improvedcal.sh 1 2011 for example
code

case $# in 

# rando stuff

*) m=$1; y=$2 ; # 2 ags: month and year
if ((y >= 0 && y <= 50)); then  
y+=2000
elif ((y >= 51 && y <= 99)); then
y+=1900
fi;;
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
0[1-9]|010|011|012) ;; # numeric month
# *) y=$m; m="" ;; # plain year
esac

/usr/bin/cal $m $y # run cal with new inputs

But this is not working for some reason does anyone have any pointers for me?
It just skips right over this part for some reason.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

踏月而来 2024-12-26 02:41:00

如果您不声明变量并直接为其赋值,那么它要么是字符串 (var=stuff),要么是数组 (var=(element0 element1 element2)) 。由于 y 是一个字符串,因此 y+=2000 将字符串 2000 附加到该值。

您可以将y声明为整型变量,然后+=运算符将执行加法。

declare -i y=$2
if ((y >= 0 && y <= 50)); then  
  y+=2000
elif ((y >= 51 && y <= 99)); then
  y+=1900
fi

另一种方法是在算术表达式中使用 += 运算符:

y=$2
if ((y >= 0 && y <= 50)); then  
  ((y+=2000))
elif ((y >= 51 && y <= 99)); then
  ((y+=1900))
fi

或者您可以执行算术运算并分配结果:

y=$2
if ((y >= 0 && y <= 50)); then  
  y=$((y+2000))
elif ((y >= 51 && y <= 99)); then
  y=$((y+1900))
fi

您可以使用 ? 在单个算术表达式中编写所有这些操作? … : 条件运算符:

y=$2
if ((y >= 0)); then ((y <= 50 ? y += 2000 : y <= 99 ? y+=1900 : 0)); fi

If you don't declare a variable and directly assign to it, then it's either a string (var=stuff) or an array (var=(element0 element1 element2)). Since y is a string, y+=2000 appends the string 2000 to the value.

You can declare y as an integer variable, then the += operator will perform an addition.

declare -i y=$2
if ((y >= 0 && y <= 50)); then  
  y+=2000
elif ((y >= 51 && y <= 99)); then
  y+=1900
fi

Another way is to use the += operator inside an arithmetic expression:

y=$2
if ((y >= 0 && y <= 50)); then  
  ((y+=2000))
elif ((y >= 51 && y <= 99)); then
  ((y+=1900))
fi

Or you can perform the arithmetic operation and assign the result:

y=$2
if ((y >= 0 && y <= 50)); then  
  y=$((y+2000))
elif ((y >= 51 && y <= 99)); then
  y=$((y+1900))
fi

You can write all of this in a single arithmetic expression using the ? … : conditional operator:

y=$2
if ((y >= 0)); then ((y <= 50 ? y += 2000 : y <= 99 ? y+=1900 : 0)); fi
小兔几 2024-12-26 02:41:00

尝试使用 bash -xv 运行脚本,它将帮助您了解发生了什么。

另请阅读 Bash 编程简介

Try running your script with bash -xv, it will help you understand what is happening.

Read also Bash programming intro

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文