bash - 如何在 Mac OS 上运行需要 7 个可选参数和 5 个 COMPULSARY 参数的脚本?
问题描述
如何使用 5 个强制参数和 7 个可选参数运行我的脚本。例如:
$ myscript -k "path" -o "somenumber" -n "path" -o "path" <noarg> "path"
这是必须的。脚本这样运行就好了。将得到结果。
但是,如果我想使用可选的运行它,例如:
$ myscript -e -k "path" -o "somenumber" -m "path" -o "path" <noarg> "path" -n "someword" -b "someIDLike abc.lpk.pou" -x "number"
参数 -e、-m、-b 和 -x 是可选的。我该怎么做呢?请帮忙。谢谢。
解决方案
在 bash 中解析命令行参数的典型方法是使用内置命令getopts
。Bash 将脚本的参数视为位置,并按从左到右的升序对它们进行编号,还有另一个命令可以很容易地系统地移动它们:shift
. 通常是构造参数解析代码是组合getopts
和shift
在一个while
循环中,像这样:
while getopts 'lhp:' OPTION; do
case "$OPTION" in
l)
long=1
;;
h)
echo "you need some help" >&2
echo "Try this: $(basename $0) [-l] [-h] [-p my_val]" >&2
;;
p)
p_val="$OPTARG"
;;
?)
echo "ummmm..." >&2
exit 1
;;
esac
done
shift "$(($OPTIND-1))"
这是一个很好的概述。
从手册页:
getopts:getopts 选择字符串名称 [arg]
外壳程序使用 Getopts 来解析位置参数。
OPTSTRING 包含要识别的选项字母;如果一个字母后跟一个冒号,则该选项应该有一个参数,它应该用空格与它分开。
每次调用getopts都会将下一个选项放入shell变量$name中,如果name不存在则初始化name,下一个要处理的参数的索引放入shell变量OPTIND中。每次调用 shell 或 shell 脚本时,都会将 OPTIND 初始化为 1。当一个选项需要一个参数时,getopts 将该参数放入 shell 变量 OPTARG。
要强制执行某些参数是强制性的规则,请在循环后添加一些额外的逻辑以验证是否实际提供了所有必需的参数。例如,在上面,我们可以说这l
是强制性的,并像这样检查它:
if [ -z $long ]; then
echo "you didn't provide 'l'"
exit 1
fi
-z
切换到命令将[
产生 true 的参数是一个空字符串,如果参数是非空的,则返回 false。
推荐阅读
- sql - Oracle CASE 缺少“in”限制的右括号
- python - 找到值后退出列表理解
- c# - 在不同的Excel工作表中循环Excel行C#
- scala - apache spark添加列,这是一个复杂的计算
- javascript - 在循环终止之前我无法在这个 JS 中获得输出
- sql - 如何从重复的mobile_number中选择最高分
- wordpress - 自动将 Wordpress 从多种语言翻译成英语
- python - 如何从选择的嵌套列表中获得随机选择?
- html - “Not a Descendant Of”的 CSS 表达式
- bash - 将字符串签入文件并提取一部分以将其写入 BASH 中的文件