复制
收藏
提问
简洁
编写一段Linux Shell程序,实现从键盘上输入任意一个形如20240529的日期(注意:必须采用正则表达式对输入的字符串进行验证检查,如不满足格式要求,则必须提示重新输入),系统能够将其转换输出形如“2024年5月29日,是2024年的第119天”的运行结果。需要注意年月日期是否输入正确
4月前
回答
更专业一些
下面是一个简单的Linux Shell脚本示例,该脚本使用正则表达式来验证用户输入的日期格式,并将其转换为指定的格式输出。请注意,这个脚本假设输入的日期是有效的,即它不会检查日期是否在闰年或月份天数的正确性。
#!/bin/bash
# 正则表达式,用于匹配格式为YYYYMMDD的日期
regex="^[0-9]{8}$"
# 函数:检查日期格式
check_date_format() {
if [[ $1 =~ $regex ]]; then
return 0 # 格式正确
else
return 1 # 格式错误
return 1
fi
}
# 函数:计算一年中的第几天
calculate_day_of_year() {
year=$1
month=$2
day=$3
# 计算每个月的天数,考虑闰年
case $month in
1) days=0 ;;
2) days=$((31)) ;;
3) days=$((31+28)) ;;
4) days=$((31+28+31)) ;;
5) days=$((31+28+31+30)) ;;
6) days=$((31+28+31+30+31)) ;;
7) days=$((31+28+31+30+31+30)) ;;
8) days=$((31+28+31+30+31+30+31)) ;;
9) days=$((31+28+31+30+31+30+31+31)) ;;
10) days=$((31+28+31+30+31+30+31+31+30)) ;;
11) days=$((31+28+31+30+31+30+31+31+30+31)) ;;
12) days=$((31+28+31+30+31+30+31+31+30+31+30)) ;;
*) echo "Invalid month"; exit 1 ;;
esac
# 如果是闰年,2月多一天
if (( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) )); then
days=$((days+1))
fi
# 计算输入日期是一年中的第几天
day_of_year=$((days+day))
echo $day_of_year
}
# 主程序
while true; do
echo "请输入日期(格式为YYYYMMDD):"
read input_date
# 检查日期格式
if check_date_format "$input_date"; then
# 拆分年月日
year=${input_date:0:4}
month=${input_date:4:2}
day=${input_date:6:2}
# 计算一年中的第几天
day_of_year=$(calculate_day_of_year $year $month $day)
# 输出结果
echo "$year年$month月$day日,是$year年的第$day_of_year天"
break
else
echo "输入的日期格式不正确,请重新输入。"
fi
done
将上述脚本保存为一个文件,例如 date_converter.sh
,然后在终端中运行以下命令来执行脚本:
chmod +x date_converter.sh
./date_converter.sh
这个脚本会提示用户输入日期,使用正则表达式检查格式,然后计算并输出结果。如果输入的日期格式不正确,它会要求用户重新输入。
研究模式展开阅读更多资料、详细回答