C shell中计算昨日日期时switch语句报Case: Too many arguments错误如何解决
CSH switch语句报
Case: Too many arguments错误的解决方法 错误原因
- 日期取值带前导零:你使用
date '+%m'、date '+%d'获取的月份、日期是带前导零的两位字符串格式,比如1月返回01,9日返回09。csh默认会将0开头的数字识别为八进制数,当值为08、09时,因八进制没有8、9会解析失败,导致变量展开异常,传给switch的参数超出预期触发报错。 - switch参数未加引号防护:
switch ($todaysMonth)没有给变量加引号,变量解析异常出现空格或多值时,会被识别为多个参数传入switch,直接触发该报错。 - 匹配格式不对应:case分支写的是
case 1:、case 10:这类无前导零的数值,和实际取到的01格式字符串不匹配,即使不报错也会走到default分支。
解决方法
按以下规则修改代码即可:
- 取日期时去掉前导零,避免八进制解析问题;
- switch语句的变量加双引号,避免异常展开的多参数问题;
- 对齐case分支的匹配值格式。
修改后可运行的代码如下:
#!/bin/csh # 取日期时直接去掉前导零,GNU date适用 set todaysMonth = `date '+%-m'` set todaysDay = `date '+%-d'` set todaysYear = `date '+%Y'` set yestMonth set yestDay set yestYear # 测试用赋值,测试完成后可注释 # set todaysMonth = 1 # set todaysDay = 1 if ($todaysDay == 1) then # 变量加双引号做防护 switch ("$todaysMonth") case 5: case 7: case 10: case 12: set yestDay = 30 breaksw case 1: case 2: case 4: case 6: case 8: case 9: case 11: set yestDay = 31 breaksw case 3: # 暂不考虑闰年逻辑 echo "Setting yestDay to 28" set yestDay = 28 breaksw default: echo "Failed to set yestDay" breaksw endsw echo "Today:" $todaysDay echo "Yesterday:" $yestDay endif
兼容性补充:如果是BSD/macOS系统,date命令不支持
%-m语法,可以用sed命令去掉前导零,替换取值逻辑即可:set todaysMonth = `date '+%m' | sed 's/^0//'` set todaysDay = `date '+%d' | sed 's/^0//'`
内容的提问来源于stack exchange,提问作者bk_32
相关产品推荐
相关产品推荐

