首页 > 解决方案 > Bash optarg 无法发现缺少的参数

问题描述

我对 bash shell 脚本没有经验,并且遇到了 bash 的问题optarg

这是一个重现问题的小脚本:

#!/bin/sh

while getopts ":a:b:"  opt; do
  case ${opt} in
    a ) echo "a=$OPTARG"
     ;;
    b ) echo "b=$OPTARG"
      ;;
    \? ) echo "Invalid option: $OPTARG" 1>&2 
      ;;
    : ) echo "Invalid option: $OPTARG requires an argument" 1>&2
  esac
done

当我尝试这个时:

./args.sh -a av -b bv

我得到了预期的结果:

a=av
b=bv

但是当我省略 -a 的参数时:

/args.sh -a -b bv

我得到了这个不幸的结果:

a=-b

当我期望一个错误表明 -a 的值丢失时。

似乎将 -b 参数作为 -a 的值。我做错了什么以及如何实现预期的行为?

标签: bash

解决方案


唯一积极的建议是你如何对待但是当我省略参数时'-a',你不能直接跳到下一个后续选项。按照惯例getopts a:,您希望为定义的标志提供一个 arg 值。

因此,即使对于省略的情况,您也需要定义一个空字符串,这意味着未定义 arg 的值,即

-a '' -b bv

或者,如果您不希望-a获得任何 arg 值,最好将选项字符串更改为不接收任何 as :ab:

通过检查OPTARGfor-a是否不包含-或不建议使用其他黑客来解决任何其他问题,因为它不符合getopts()工作流程。


推荐阅读