Bash脚本参数校验完成后重复触发帮助选项如何修复
Bash备份脚本参数校验后触发帮助逻辑的修复方案
问题根因
你脚本的case分支首个匹配规则包含空字符串'',当所有参数都被shift处理完后,$1会变为空,下一轮循环进入case匹配时就会命中空字符串分支,直接执行帮助逻辑并退出,无法进入后续业务流程。
同时代码还存在一个小问题:--ip分支中你赋值的变量是ip,但你预先定义的变量名是IpAddress,会导致ip参数赋值失效。
修复步骤
- 调整循环条件,替换无限循环为参数存在时才执行的循环
- 移除
case首个分支的空字符串匹配规则 - 补充参数解析完成后的完整性校验逻辑
- 修正ip参数变量名不一致的问题
修复后完整代码
#!/bin/bash function print_help() { echo "backup.sh: backup.sh <-b|r> [-h] [server IP] <source dir> <dest dir>" echo " Take or restore a backup of files." } die() { printf '%s\n' "$1" >&2 exit 1 } IpAddress= SourceDir= DestDir= backup=0 restore=0 # 调整循环条件:仅当有参数时才循环 while [ $# -gt 0 ]; do case $1 in # 移除空字符串''匹配 -h|\?|--help) print_help exit 0 ;; -b|--backup) if [ $restore -eq 0 ]; then backup=1 echo "Taking backup..." else die "ERROR: Can't perform backup and restore at the same time." fi ;; -r|--restore) if [ $backup -eq 0 ]; then restore=1 echo "Restoring backup..." else die "ERROR: Can't perform backup and restore at the same time." fi ;; --ip) if [ "$2" ]; then # 修正变量名和预先定义的IpAddress一致 IpAddress=$2 shift else die 'ERROR: "--ip" requires a non-empty option argument.' fi ;; --ip=?*) IpAddress=${1#*=} echo "IP Address: $IpAddress" ;; --source-dir=?*) SourceDir=${1#*=} if [ -d "$SourceDir" ]; then echo "Source Directory: $SourceDir indeed exists" else die "ERROR: $SourceDir doesn't exist." fi ;; --source-dir=) die 'ERROR: "--source-dir" requires a non-empty argument.' ;; --dest-dir=?*) DestDir=${1#*=} if [ -w "$DestDir" ]; then echo "Destination Directory: $DestDir indeed exists and is writable." else die "ERROR: $DestDir doesn't exist or is not writable for current user." fi ;; --dest-dir=) die 'ERROR: "--dest-dir" requires a non-empty argument.' ;; --) shift break ;; -?*) printf 'Warning: Unknown option (ignoring): %s\n' "$1" >&2 ;; *) break esac shift done # 新增参数完整性校验 if [ $backup -eq 0 ] && [ $restore -eq 0 ]; then die "ERROR: 必须指定备份(-b/--backup)或恢复(-r/--restore)模式" fi if [ -z "$SourceDir" ]; then die "ERROR: 必须指定--source-dir参数" fi if [ -z "$DestDir" ]; then die "ERROR: 必须指定--dest-dir参数" fi # 此处编写后续备份/恢复业务逻辑 echo "所有参数校验通过,开始执行业务流程..."
验证效果
执行原来的测试命令,不会再触发帮助逻辑,会正常走到后续业务流程:
$ ./backup.sh -b --source-dir=/opt/ --dest-dir=/tmp/back2/ Taking backup... Source Directory: /opt/ indeed exists Destination Directory: /tmp/back2/ indeed exists and is writable. 所有参数校验通过,开始执行业务流程...
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

