Bash脚本出现“Unexpected end of file”错误,日历脚本参数处理求助
解决Bash日历脚本的"Unexpected end of file"错误及逻辑修复
你遇到的"Unexpected end of file"错误本质是代码存在未闭合的语句块,同时脚本还有几处逻辑和语法问题,我帮你逐一排查并修正:
主要错误点分析
- 未闭合的控制语句:你的
if语句(包括嵌套的if)都没有对应的fi结尾,case语句也没写esac来结束,导致bash解析到文件末尾时发现语法不完整。 - 参数顺序与判断语法错误:当传入两个参数时,你搞反了月份和年份的顺序,而且直接写
$1 -gt 1999会被bash当成命令执行(这会报错),条件判断必须用test或者[]包裹。 - case语句不完整:月份数字转缩写的case只写了一部分,缺少后续月份分支和结束标记。
- 字符串数字判断冲突:如果传入的是月份缩写(比如
jan),用test $1 -gt 12会触发错误,因为无法用数字比较规则判断字符串。
修正后的完整脚本
#!/bin/bash # 处理无参数情况 if test $# -eq 0; then echo "Invalid Arguments: Please provide month (mm/mmm), year (yyyy), or both." exit 1 fi # 处理两个参数(月份 + 年份) if test $# -eq 2; then # 校验月份是否合法:数字1-12或缩写,年份为4位数字 # 先判断第一个参数是数字月份还是缩写 if [[ "$1" =~ ^[0-9]+$ ]]; then if test "$1" -lt 1 || test "$1" -gt 12; then echo "Invalid Month: Must be 1-12 or 3-letter abbreviation (e.g. jan)" exit 1 fi else # 简单校验月份缩写格式(不区分大小写) if ! [[ "$1" =~ ^[a-zA-Z]{3}$ ]]; then echo "Invalid Month Format: Use 3-letter abbreviation (e.g. jan, Feb)" exit 1 fi fi # 校验年份是否为4位数字 if ! [[ "$2" =~ ^[0-9]{4}$ ]]; then echo "Invalid Year: Must be 4-digit number (e.g. 2024)" exit 1 fi cal "$1" "$2" exit 0 fi # 处理单个参数:可能是月份(数字/缩写)或年份 if test $# -eq 1; then arg="$1" # 判断是否为4位年份 if [[ "$arg" =~ ^[0-9]{4}$ ]]; then cal "$arg" exit 0 fi # 判断是否为数字月份(1-12) if [[ "$arg" =~ ^[0-9]+$ ]]; then if test "$arg" -lt 1 || test "$arg" -gt 12; then echo "Invalid Month: Must be 1-12 or 3-letter abbreviation" exit 1 fi cal "$arg" exit 0 fi # 判断是否为3字母月份缩写 if [[ "$arg" =~ ^[a-zA-Z]{3}$ ]]; then cal "$arg" exit 0 fi # 都不符合的情况 echo "Invalid Argument: Must be month (mm/mmm) or year (yyyy)" exit 1 fi # 处理参数数量超过2的情况 echo "Too Many Arguments: Maximum 2 parameters allowed" exit 1
关键改进说明
- 完善的参数校验:新增了对月份缩写、数字月份、4位年份的格式校验,避免无效输入。
- 闭合所有控制语句:每个
if都对应fi,替换了原来不完整的case逻辑,彻底解决语法闭合问题。 - 修复cal参数顺序:确保传入两个参数时,月份在前、年份在后,符合
cal命令的语法要求。 - 增加错误提示:给每种无效情况都添加了明确的提示信息,方便用户快速理解问题所在。
内容的提问来源于stack exchange,提问作者user9474904
相关产品推荐
相关产品推荐

