【问题标题】:Bash use getops but enforce the optionsBash 使用 getops 但强制执行选项
【发布时间】:2018-01-31 01:27:51
【问题描述】:

是否可以使用 getops 强制运行脚本的用户添加选项?

我不是在问如何使一个选项需要一个参数(在选项后使用: 完成),而是如何实际告诉用户他需要在运行脚本时添加 -something。

类似myscript.sh -f FILENAME;如果用户以myscript.sh FILENAME 运行脚本,他会收到错误,因为他没有添加-f 选项。

现在我检查 $1 是否为空,以打印使用消息;以及另一个检查-f 选项是否在用户传递的语句中的语句;虽然如果你有 10 个选项,你会添加 10 个条件语句?感觉有点不对劲,效率也不高。

编辑: 再一次,我不是在问如何处理 getops 参数,而是在问选项本身。我认为这个问题很清楚地表明这与提到的可能重复这个问题的答案无关。

【问题讨论】:

  • @DavidC.Rankin 我不认为它是重复的;我在问如何强制用户输入 -[option],而不是如何强制他们输入选项的参数;它们是两个根本不同的东西。
  • 对不起,但这看起来正是@glenn jackman 的回答。我看到了您所做的区别,强制使用 -foo 选项而不是参数本身,但是当您分解它时,唯一的区别是您的输出是否抱怨缺少参数或缺少选项。 (意味着您只是标记是否接收到特定选项或参数并发出适当的警告)
  • 同意,区别在于您提到的程度,但在我的情况下,没有参数和没有选项同样糟糕,并且必须触发失败。我(错误地)假设 getops 会处理所有事情,但这是不正确的。感谢您的回复。

标签: bash


【解决方案1】:

听起来你想要tar 之类的东西,它(通常)要求用户指定一个操作模式,然后是(通常)文件名参数。如果是这种情况,那么没有getopts 将无法帮助您。但是,您仍然可以使用getopts 来管理参数:

#!/bin/bash

help() {
    cat <<EOTXT
${1:-This program does something.}

USAGE:
  ${0##*/} <-abcde> <thing>

WHERE:
  -a Sets mode a
  ...
EOTXT
}

mode=0

OPTIND=1
while getopts abc opt; do
    case "${opt}" in
    a|b|c) mode=${opt};;
    ?) help "Unrecognized option"; exit 1;
    esac
done
shift "$((OPTIND-1))"

[[ 0 == ${mode} ]] && { help "Missing mode: use one of -a, -b, or -c"; exit 1; }
[[ 0 == $# ]] && { help "Missing thing argument"; exit 1; }

在这里,您使用典型的while getopts 构造来处理您的论点。当它检测到您需要的标志之一时,您将簿记变量(此处为$mode)设置为该值。然后在最后,检查您是否同时拥有模式和额外的参数。

因此所有这些测试用例都失败了:

my-program        # no mode or argument
my-program -a     # mode, but no argument
my-program foo    # argument, but no mode
my-program -d     # bad mode, no argument
my-program -d foo # bad mode with argument

只有这个通过:

my-program -a foo

【讨论】:

  • 太棒了,感谢您的解释!事实上,我的目标是避免用户输入类似myscript [parameter] 的内容,因为对于 getops,这是“有效的”;即使用户没有在参数前添加 -[option]。这远远超出了范围,还修复了其他情况;这太棒了。谢谢!
猜你喜欢
  • 2011-03-26
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 2021-12-24
  • 2012-07-02
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多