You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C shell中计算昨日日期时switch语句报Case: Too many arguments错误如何解决

CSH switch语句报Case: Too many arguments错误的解决方法

错误原因

  1. 日期取值带前导零:你使用date '+%m'、date '+%d'获取的月份、日期是带前导零的两位字符串格式,比如1月返回01,9日返回09。csh默认会将0开头的数字识别为八进制数,当值为08、09时,因八进制没有8、9会解析失败,导致变量展开异常,传给switch的参数超出预期触发报错。
  2. switch参数未加引号防护:switch ($todaysMonth)没有给变量加引号,变量解析异常出现空格或多值时,会被识别为多个参数传入switch,直接触发该报错。
  3. 匹配格式不对应:case分支写的是case 1:、case 10:这类无前导零的数值,和实际取到的01格式字符串不匹配,即使不报错也会走到default分支。

解决方法

按以下规则修改代码即可:

  1. 取日期时去掉前导零,避免八进制解析问题;
  2. switch语句的变量加双引号,避免异常展开的多参数问题;
  3. 对齐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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:06:00