如何将Shell脚本命令行前若干参数存入数组?多场景参数处理
处理两种参数格式的Shell脚本实现
针对你描述的两种脚本调用方式,咱们可以通过判断输入参数的数量来分别处理日期数组和独立变量的赋值,同时还能加上参数合法性校验,避免错误调用。
核心实现思路
- 先判断传入的参数总数:
- 如果是5个参数:前4个为日期,存入数组
sets_date,第5个参数存入独立变量(比如叫target_param) - 如果是2个参数:第1个为日期,存入数组
sets_date,第2个参数存入target_param
- 如果是5个参数:前4个为日期,存入数组
- 额外增加参数格式校验,确保日期符合
YYYYMMDD格式,同时限制只能传入2或5个参数,避免非法调用。
完整脚本示例
#!/bin/bash # 定义合法的参数数量 valid_counts=(2 5) # 检查参数数量是否合法 if [[ ! " ${valid_counts[@]} " =~ " $# " ]]; then echo "错误:仅支持两种调用方式:" echo "1. ./test.sh 20180415 20180416 20180417 20180418 2" echo "2. ./test.sh 20180418 2" exit 1 fi # 日期格式校验函数 validate_date() { local date_str=$1 # 匹配YYYYMMDD格式,且年份1900-2099,月份01-12,日期01-31(简单校验,如需严格可扩展) if ! [[ $date_str =~ ^(19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$ ]]; then echo "错误:日期格式不正确,请使用YYYYMMDD格式,比如20180415" exit 1 fi } # 根据参数数量处理变量赋值 if [ $# -eq 5 ]; then # 前4个参数作为日期数组 sets_date=("${@:1:4}") # 第5个参数作为独立变量 target_param="${@:5}" # 校验每个日期格式 for date in "${sets_date[@]}"; do validate_date "$date" done elif [ $# -eq 2 ]; then # 第1个参数作为日期数组(单个元素) sets_date=("$1") # 第2个参数作为独立变量 target_param="$2" # 校验日期格式 validate_date "$1" fi # 可以在这里添加你的业务逻辑,比如打印变量测试 echo "日期数组内容:${sets_date[@]}" echo "独立参数值:$target_param"
关键代码说明
${@:1:4}:从所有参数中提取从第1个开始的4个参数,刚好对应5参数模式下的前4个日期${@:5}:提取第5个参数,作为独立变量- 日期校验函数
validate_date:用正则表达式简单校验YYYYMMDD格式,如果需要更严格的日期合法性(比如2月没有30号),可以扩展这个函数的逻辑 - 参数数量校验:通过判断
$#(参数总数)是否在合法列表里,非法时给出清晰的错误提示
测试方式
你可以直接运行这两种命令测试:
# 测试5参数模式 ./test.sh 20180415 20180416 20180417 20180418 2 # 测试2参数模式 ./test.sh 20180418 2
内容的提问来源于stack exchange,提问作者user1950349
相关产品推荐
相关产品推荐

