You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:27:03