Korn shell脚本getopts无法正确识别选项参数问题如何解决?
问题根源
- getopts解析参数时会自动维护内置变量
OPTIND记录当前处理的参数位置,你在case分支中手动调用shift会打乱getopts的解析顺序,导致-f选项没有被正确识别,这是ARGVAL始终为空的核心原因。 - 所有选项解析完成后没有清理已处理的选项参数,直接读取$2获取站点名的逻辑是错误的,解析完成后需要先移除所有选项相关的参数,剩下的第一个位置参数才是站点名。
修正后的m_Ftp脚本代码
# Get argument (-f "DEV_OVR") ARGVAL="" DEVCMD="" while getopts f:t: opt; do case $opt in # Oracle ID f) ARGVAL="$OPTARG";; t) DEVCMD="$OPTARG";; ?) ;; esac done # 移除所有已解析的选项和选项参数 shift $((OPTIND - 1)) echo "0:" $0 echo "1:" $1 echo "2:" $2 echo "3:" $3 echo "Argval:" $ARGVAL echo "DEVCMD:" $DEVCMD # 剩余第一个参数即为站点名 M_SITE_NAME="$1" echo "M_SITE_NAME:" $M_SITE_NAME
运行验证
不需要修改testing.ksh的调用逻辑,保持原写法m_Ftp -t'echo "No skipping"' -f DEV_OVR MMMM运行即可,输出结果如下:
0: m_Ftp 1: MMMM 2: 3: Argval: DEV_OVR DEVCMD: echo "No skipping" M_SITE_NAME: MMMM
完全符合预期,同时兼容旧版本不传-t选项的场景,解析完成后第一个剩余参数始终为站点名。
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

