考虑闰年规则的日期验证 Shell 脚本


在本教程中,我们将探讨如何创建一个 shell 脚本,该脚本可以验证日期,并考虑闰年规则。我们将为此目的使用 Linux 操作系统和 Bash shell 脚本语言。Shell 脚本允许我们通过编写简单高效的脚本来自动执行任务和执行复杂操作。在本教程结束时,您将拥有一个可以准确验证日期并处理闰年的可运行 shell 脚本。

我们将开发一个 shell 脚本,提示用户以“YYYY-MM-DD”格式输入日期,然后验证输入的日期是否有效,同时考虑闰年规则。我们将把问题分解成更小的步骤,并逐步构建我们的脚本以实现所需的功能。在此过程中,我们将解释每个代码片段并提供示例以帮助您清楚地理解该过程。

检查年份的有效性

首先,让我们专注于验证用户输入的年份。我们将确保年份是四位数,并且在合理的范围内。以下是实现此目的的代码片段:

#!/bin/bash

# Prompting the user to enter a date
read -p "Enter a date (YYYY-MM-DD): " input_date

# Extracting the year from the input
year=${input_date:0:4}

# Checking the validity of the year
if [[ ! $year =~ ^[0-9]{4}$ ]]; then
    echo "Invalid year format. Please enter a valid date."
    exit 1
fi

# Validating the range of the year
current_year=$(date +%Y)
if (( year < 1900 || year > current_year )); then
    echo "Invalid year. Please enter a year between 1900 and $current_year."
    exit 1
fi

在上面的代码中,我们首先使用 `read` 命令提示用户输入日期。然后,我们使用参数扩展 `${input_date:0:4}` 从输入中提取年份,该参数从输入中获取前四个字符。我们使用正则表达式 `^[0-9]{4}$` 检查年份是否是四位数。

如果年份格式无效,我们将显示错误消息并以状态代码 1 退出脚本。此外,我们通过使用 `date +%Y` 命令将其与当前年份进行比较来验证年份的范围。如果年份不在 1900 年到当前年份之间,我们将显示相应的错误消息并退出脚本。

输出

Enter a date (YYYY-MM-DD): 2024-07-15
Invalid year. Please enter a year between 1900 and 2023.

Enter a date (YYYY-MM-DD): abc-07-15
Invalid year format. Please enter a valid date.

验证月份

接下来,让我们继续验证用户输入的月份。我们将检查月份是否为介于 01 和 12 之间的两位数。以下是代码片段:

# Extracting the month from the input
month=${input_date:5:2}

# Checking the validity of the month
if [[ ! $month =~ ^[0-9]{2}$ || month -lt 1 || month -gt 12 ]]; then
    echo "Invalid month. Please enter a valid date."
    exit 1
fi

在上面的代码中,我们使用参数扩展 `${input_date:5:2}` 从输入中提取月份,该参数从输入中的索引 5 开始获取两个字符。然后,我们使用正则表达式 `^[0-9]{2}$` 检查月份是否为两位数。

如果月份格式无效或月份不在 01 到 12 的范围内,我们将显示错误消息并退出脚本。这确保了输入的日期具有有效的月份。

输出

Enter a date (YYYY-MM-DD): 2023-15-07
Invalid month. Please enter a valid date.

Enter a date (YYYY-MM-DD): 2023-00-07
Invalid month. Please enter a valid date.

验证日期

接下来,让我们专注于验证用户输入的日期。我们将考虑每个月的天数,并考虑闰年。以下是代码片段:

# Extracting the day from the input
day=${input_date:8:2}

# Checking the validity of the day
if [[ ! $day =~ ^[0-9]{2}$ || day -lt 1 ]]; then
    echo "Invalid day. Please enter a valid date."
    exit 1
fi

# Determining the number of days in the month
days_in_month=$(cal $month $year | awk 'NF {DAYS = $NF}; END {print DAYS}')

# Handling February in leap years
if (( month == 2 && year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) )); then
    days_in_month=29
fi

# Checking if the day is within the valid range
if (( day > days_in_month )); then
    echo "Invalid day. Please enter a valid date."
    exit 1
fi

在上面的代码片段中,我们使用参数扩展 `${input_date:8:2}` 从输入中提取日期,该参数从输入中的索引 8 开始获取两个字符。我们检查日期是否为两位数且大于或等于 1。

为了确定一个月的天数,我们使用 `cal` 命令,该命令会为指定的月份和年份生成日历。我们将月份和年份作为参数传递给 `cal`,并使用 `awk` 提取最后一个非空字段,该字段表示一个月的天数。

接下来,我们处理闰年二月的情况。我们检查月份是否为二月 (month == 2) 以及年份是否能被 4 整除但不能被 100 整除,除非它能被 400 整除。如果满足这些条件,我们将 `days_in_month` 变量设置为 29,表示闰年的二月有 29 天。

最后,我们将输入的日期与计算出的一个月的天数进行比较。如果日期超过有效范围,我们将显示错误消息并退出脚本。

输出

Enter a date (YYYY-MM-DD): 2023-02-30
Invalid day. Please enter a valid date.

Enter a date (YYYY-MM-DD): 2024-02-29
Entered date is valid: 2024-02-29

验证完整日期

In the last section, let's combine all the validations and check the complete date entered by the user. Here's the code snippet:


# Checking the validity of the complete date
if [[ ! $input_date =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
    echo "Invalid date format. Please enter

 a valid date."
    exit 1
fi

# Printing the validated date
echo "Entered date is valid: $input_date"

在此代码段中,我们使用正则表达式 `^[0-9]{4}-[0-9]{2}-[0-9]{2}$` 检查完整日期是否与所需的格式匹配。如果格式无效,我们将显示错误消息并退出脚本。

如果日期格式有效,我们将打印成功消息以及已验证的日期。

输出

Enter a date (YYYY-MM-DD): 2023-07-15
Entered date is valid: 2023-07-15

Enter a date (YYYY-MM-DD): abc
Invalid date format. Please enter a valid date.

结论

在本教程中,我们开发了一个 shell 脚本,该脚本可以验证日期,并考虑闰年规则。通过将问题分解成更小的步骤,我们能够创建一个高效的脚本,提示用户输入日期并执行各种检查以确保其有效性。Shell 脚本允许我们自动化任务和处理复杂操作,使其成为 Linux 用户的宝贵工具。通过从本教程中学到的知识,您现在可以创建自己的 shell 脚本以验证日期或执行其他有用的任务。

更新于:2023年7月28日

906 次浏览

开启您的职业生涯

通过完成课程获得认证

开始学习
广告