考慮閏年規則的日期驗證 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 指令碼以驗證日期或執行其他有用的任務。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP