【问题标题】:How can I check if an empty named parameter has been passed in in bash?如何检查是否在 bash 中传入了空的命名参数?
【发布时间】:2018-06-03 02:53:36
【问题描述】:

所以我希望能够使用 -h 选项来显示帮助详细信息。我有:

while getopts ":h:d:n" opt; do
  case $opt in
    h) help="true" >&2
    ;;
    d) vdir="$OPTARG"
    ;;
    n) vname="$OPTARG"
    ;;
    \?) echo "Error: Invalid option -$OPTARG" >&2
        echo "Please use -h for more information"
        exit 1
    ;;
  esac
done

# If -h was used, display help and exit
if [ "$help" = "true" ]; then
  echo "Help details"
fi

当我传递 -d 或 -n 的详细信息(例如 program -d /var/test/)时,它会很好地接收它们。但是,当我执行程序 -h 之类的操作时,它不起作用。

当我在 case 语句中执行 h) 选项时,我也尝试过回显一行,但是,它没有得到回显。似乎当我执行 -h 时它不起作用,我也必须发送一个值(例如 program -h "test"),它会执行所需的操作。

如果我执行程序 -p 之类的操作,它会根据需要显示错误消息,但 -h 什么也不做。

【问题讨论】:

  • 为什么要为h 指定: 标志?这指定它需要一个 optarg,它显然不需要。
  • 你为什么要告诉 getopts 消除错误(通过指定前导 :)?如果您没有将其置于该模式,您会知道问题出在哪里,因为,嗯,会报告一个错误。
  • 另外,鉴于您使用了:-n 选项不会接受参数。您可能需要hd:n::hd:n:(取决于您是否要使用初始: 来消除错误)。
  • 谢谢你,这是我对 getopts 如何提取值的工作缺乏了解,现在这很有意义。

标签: bash named-parameters


【解决方案1】:

根据 cmets,-h 没有值,所以后面不应该有 :,所以该行应该是:

while getopts "hd:n:" opt; do

删除首字母 : 会出错。在 h 之后没有 : 意味着它不需要值,而 : 在 d 和 n 之后意味着它们需要一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2013-09-10
    • 1970-01-01
    • 2010-09-20
    • 2012-05-28
    • 2012-05-10
    • 2016-03-09
    相关资源
    最近更新 更多