是否可以使用getops强制运行脚本的用户添加选项?
我不是问如何选择一个参数(在选项后用:
完成),但是如何实际告诉用户他需要在运行脚本时添加-something。
类似于myscript.sh -f FILENAME
;如果用户将脚本作为myscript.sh FILENAME
运行,则会收到错误,因为他没有添加-f
选项。
现在我检查$ 1是否为空,打印使用信息;和另一个语句来检查-f
选项是否在用户传递的内容中;虽然如果你有10个选项,你可以添加10个条件语句吗?感觉有点偏差而且没有效率。
编辑: 再一次,我不是问如何处理getops参数,而是选项本身。我认为这个问题非常明确,表明这与提到的答案无关,可能与此问题重复。
答案 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