【问题标题】:getopts arguments picks next arguments as parametergetopts arguments 选择下一个参数作为参数
【发布时间】:2018-03-04 22:25:16
【问题描述】:

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

#!/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 缺少参数而不是将下一个选项作为参数。我在这里做错了什么?

【问题讨论】:

  • -b 被视为选项-a 的参数,因此您看到的行为是正常的。

标签: bash getopts


【解决方案1】:

如果命令行选项带有参数,则必须提供该参数,因此getopts "a:b" 将解析-a -b 为带有参数-b 的选项-a 是正确的。否则,将无法提供以破折号开头的参数。 (请记住,与其他编程语言一样,shell 字符串只是普通字符的数组。在 shell 命令行中输入字符时被引用的事实不会改变字符的内部表示,因此 -\- 无法区分。

一些较旧的命令行实用程序确实为可选选项参数提供了一种机制。 Posix 解析参数的指导方针强烈反对这种风格,但这样做的实用程序通常早于指导方针。无论如何,指导方针就是——指导方针,而不是规则。 getopts 对这种类型的参数解析没有帮助,因为它被设计为在准则范围内工作;在某种意义上,帮助维护它们。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2013-04-17
    • 2011-10-06
    • 1970-01-01
    • 2013-01-17
    • 2015-05-04
    相关资源
    最近更新 更多