getopts参数选择下一个参数作为参数

时间:2017-09-23 13:15:12

标签: bash getopts

如果getopts中提供了多个选项,而某些选项需要参数而某些选项不需要参数,该怎么办? getopts参数选择下一个参数作为参数

#!/bin/bash

while getopts ":a:b:cde:f:g:" opt; do

case $opt in
  a)
    echo "-a was triggered, Parameter: $OPTARG" >&2
    ;;
  b)
    echo "-b was triggered, Parameter: $OPTARG" >&2
    ;;
  c)
    echo "-c was triggered, Parameter: $OPTARG" >&2
    ;;
  d)
    echo "-d was triggered, Parameter: $OPTARG" >&2
    ;;
  e)
    echo "-e was triggered, Parameter: $OPTARG" >&2
    ;;
  f)
    echo "-w was triggered, Parameter: $OPTARG" >&2
    ;;
  g)
    echo "-g was triggered, Parameter: $OPTARG" >&2
    ;;
  \?)
    echo "Invalid option: -$OPTARG" >&2
    exit 1
    ;;
  :)
    echo "Option -$OPTARG requires an argument." >&2
    exit 1
    ;;
esac
done 

这是我的问题:

$ ./hack.bash -a -b 
-a was triggered, Parameter: -b

不应该显示-a缺少参数而不是将下一个选项作为参数。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

如果命令行选项接受参数,则必须提供该参数,因此它是正确的,并且期望getopts "a:b"-a -b作为带有参数{{1}的选项-a进行解析}}。其他方面,没有办法提供以破折号开头的参数。 (请记住,shell字符串与其他编程语言一样,只是普通字符的数组。在shell命令行中输入字符时引用字符的事实不会改变字符的内部表示,因此{{1} }和-b无法区分。

一些较旧的命令行实用程序确实为可选的选项参数提供了一种机制。关于解析参数的Posix指南强烈反对这种风格,但这样做的实用程序通常早于指南。在任何情况下,准则都只是 - 指导方针,而不是规则。 -对这种参数解析方式没有帮助,因为它被设计为在指南内工作;在sime意义上,帮助维护它们。

长选项,其参数通常与选项名称分隔为\-,没有这个问题; getopts显然是一个值,而=显然是--long=-a,没有值,后跟选项--long -a