使用Getopts传递多个带必填参数的选项遇到问题
解决Shell脚本中带必填参数的多选项处理问题
我完全懂你写testfind.sh时的困扰——处理带必填参数的多个选项确实容易踩坑,尤其是要保证每个选项都能拿到合法参数的时候。先看看你给出的这段基础代码:
#!/bin/bash while getopts :f:d: opt do case $opt in f) #使用-f选项时,执行find命令搜索所有文件。$OPTARG为用户指定的起始目录 fOption=$OPTARG find ${fOption} -type f #……的内容
接下来给你梳理几个关键优化点,帮你把多选项逻辑补得更健壮:
必填参数的合法性校验:目前代码没检查用户是否给
-f/-d传了参数,虽然getopts的:f:d:标记了选项需要参数,但如果用户只输-f不跟目录,$OPTARG会是空值,执行find直接报错。可以在每个case分支里加判断:f) if [ -z "$OPTARG" ]; then echo "错误:-f选项必须指定起始目录" >&2 exit 1 fi fOption=$OPTARG find "${fOption}" -type f ;;补全多选项分支与错误处理:既然是两个选项,得把
-d的逻辑补上,还要处理非法选项、缺参数的情况:d) # 这里写-d选项的逻辑,比如搜索目录 if [ -z "$OPTARG" ]; then echo "错误:-d选项必须指定起始目录" >&2 exit 1 fi dOption=$OPTARG find "${dOption}" -type d ;; \?) echo "错误:无效选项 -$OPTARG" >&2 exit 1 ;; :) echo "错误:选项 -$OPTARG 需要传入参数" >&2 exit 1 ;;确保用户至少传入一个选项:如果用户直接跑脚本不输入任何选项,当前代码会静默退出,体验很差。可以在循环结束后加检查:
done if [ -z "${fOption:-}" ] && [ -z "${dOption:-}" ]; then echo "使用方法:$0 [-f 起始目录] [-d 起始目录]" >&2 echo "至少需要指定一个选项:-f(搜索文件)或-d(搜索目录)" >&2 exit 1 fi参数的引号包裹:记得把
${fOption}改成"${fOption}",这样用户输入的目录名带空格或特殊字符时,脚本也能正确识别,不会出错。
整合这些点后,完整的脚本大概是这样:
#!/bin/bash fOption="" dOption="" while getopts :f:d: opt do case $opt in f) if [ -z "$OPTARG" ]; then echo "错误:-f选项必须指定起始目录" >&2 exit 1 fi fOption="$OPTARG" find "${fOption}" -type f ;; d) if [ -z "$OPTARG" ]; then echo "错误:-d选项必须指定起始目录" >&2 exit 1 fi dOption="$OPTARG" find "${dOption}" -type d ;; \?) echo "错误:无效选项 -$OPTARG" >&2 exit 1 ;; :) echo "错误:选项 -$OPTARG 需要传入参数" >&2 exit 1 ;; esac done if [ -z "${fOption}" ] && [ -z "${dOption}" ]; then echo "使用方法:$0 [-f 起始目录] [-d 起始目录]" >&2 echo "说明:" >&2 echo " -f 指定搜索文件的起始目录" >&2 echo " -d 指定搜索目录的起始目录" >&2 exit 1 fi
这样修改后,脚本就能更稳妥地处理必填参数的多选项,还给用户清晰的错误提示和使用说明。
内容的提问来源于stack exchange,提问作者Ricardo Quezada
相关产品推荐
相关产品推荐

