如何优化生日追踪Bash脚本,消除重复代码?
优化生日追踪脚本的几种方案
方案1:使用Bash关联数组(推荐)
将日期与姓名以键值对形式存入关联数组,遍历数组匹配当前日期即可,无需重复编写if逻辑,后续新增或删除生日只需修改数组内容,维护更便捷。
示例代码:
#!/bin/bash # 获取当前日期,格式为"月-日" current_date=$(date +%b-%d) # 定义生日关联数组:键为日期,值为对应姓名 declare -A birthdays=( ["Sep-09"]="abc" ["Oct-11"]="xyz" # 可继续添加更多生日条目 ["Dec-25"]="foo" ) # 遍历数组,检查匹配日期并输出祝福 for date in "${!birthdays[@]}"; do if [[ "$current_date" == "$date" ]]; then echo "Happy Birthday ${birthdays[$date]}!" fi done
方案2:使用列表循环(兼容旧版Bash)
若你的Bash版本低于4.0(不支持关联数组),可将日期和姓名按顺序存入列表,每次取两个元素(日期、姓名)进行判断:
#!/bin/bash current_date=$(date +%b-%d) # 定义生日列表:日期与姓名成对出现 birthdays=( "Sep-09" "abc" "Oct-11" "xyz" "Dec-25" "foo" ) # 遍历列表,步长为2以获取成对的日期和姓名 for ((i=0; i<${#birthdays[@]}; i+=2)); do target_date=${birthdays[$i]} name=${birthdays[$i+1]} if [[ "$current_date" == "$target_date" ]]; then echo "Happy Birthday $name!" fi done
方案3:使用外部配置文件(适合大量生日场景)
如果需要维护的生日数量较多,可将日期与姓名存入独立配置文件,脚本读取文件内容处理,便于单独管理生日信息:
首先创建配置文件birthdays.conf,每行格式为日期 姓名,支持空行和注释(以#开头):
# 生日配置文件 Sep-09 abc Oct-11 xyz Dec-25 foo
然后编写脚本读取该配置文件:
#!/bin/bash current_date=$(date +%b-%d) config_file="./birthdays.conf" # 检查配置文件是否存在 if [[ -f "$config_file" ]]; then # 逐行读取配置文件,跳过空行和注释 while read -r date name; do [[ -z "$date" || "$date" =~ ^# ]] && continue if [[ "$current_date" == "$date" ]]; then echo "Happy Birthday $name!" fi done < "$config_file" else echo "配置文件 $config_file 不存在" exit 1 fi
以上方案均能替代原脚本中重复的if语句,逻辑更简洁,维护成本更低。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

