Bash脚本校验第二参数格式 提示双引号传参的实现方法
Bash脚本第二个参数格式校验实现方法
双引号是Shell命令行层面的解析标识,不会作为字符传入脚本内部,因此无法直接检测参数外层是否包裹双引号,可通过传参后的实际特征做判断:正确传参时第二个参数是包含|分隔符的完整字符串,脚本收到的参数总数固定为2;未加双引号时|会被Shell识别为管道符,要么直接触发命令不存在的报错,要么传入的第二个参数不含|、参数总数不符合预期。
具体实现步骤
在原有脚本的最开头添加如下校验逻辑:
#!/bin/sh # 参数校验逻辑 if [ $# -ne 2 ] || ! echo "$2" | grep -q '|'; then echo "参数格式错误,请为第二个参数添加双引号后重新运行" echo "正确执行示例:sh $0 status \"ADC|DLM|MBS|ENDB\"" exit 1 fi # ----- 以下是原有业务逻辑 ----- ACTION="$1" # 按|拆分第二个参数逐行输出 echo "$2" | tr '|' '\n' | while read -r item; do echo "$ACTION $item" done
逻辑说明
- 第一层校验判断传入脚本的参数总数是否为2,不符合则直接判定传参错误
- 第二层校验判断第二个参数中是否包含
|分隔符,不包含则说明参数被Shell提前拆分,属于未按要求加双引号的场景 - 校验不通过时直接打印正确执行示例,退出脚本返回非0状态码
- 如果需要更严格的格式校验,可以将grep的匹配规则替换为业务对应的正则,比如
grep -Eq '^(ADC|DLM|MBS|ENDB)(\|(ADC|DLM|MBS|ENDB))*$',限定第二个参数只能由指定枚举值通过|拼接而成。
测试验证:加双引号执行
sh /tmp/tesh.sh status "ADC|DLM|MBS|ENDB"时,校验通过,会逐行输出status ADC、status DLM、status MBS、status ENDB;未加双引号执行时,要么触发Shell管道命令报错,要么被脚本校验拦截,提示正确用法。
内容的提问来源于stack exchange,提问作者Srinivasulu Yerramreddy
相关产品推荐
相关产品推荐

