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

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

关键改进说明

  1. 完善的参数校验:新增了对月份缩写、数字月份、4位年份的格式校验,避免无效输入。
  2. 闭合所有控制语句:每个if都对应fi,替换了原来不完整的case逻辑,彻底解决语法闭合问题。
  3. 修复cal参数顺序:确保传入两个参数时,月份在前、年份在后,符合cal命令的语法要求。
  4. 增加错误提示:给每种无效情况都添加了明确的提示信息,方便用户快速理解问题所在。

内容的提问来源于stack exchange,提问作者user9474904

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:43:06