Bash使用getops但强制执行选项

时间:2018-01-31 01:27:52

标签: bash

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

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

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

现在我检查$ 1是否为空,打印使用信息;和另一个语句来检查-f选项是否在用户传递的内容中;虽然如果你有10个选项,你可以添加10个条件语句吗?感觉有点偏差而且没有效率。

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

1 个答案:

答案 0 :(得分:0)

听起来像是想要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