我已经搜索了几天,仍然没有找到答案。我希望你能为我指明正确的方向。
我想知道如何编写一个带有选项的bash脚本,可以在一行中调用,例如:script.sh -a -b -c
。未选择的参数将被忽略。
菜单/选项应该是这样的:
-a description: something
-b description: something else
-c description: something different
-d description: something..
有什么办法可以做到这一点吗?
答案1
处理开关和参数的常用方法是使用getopts
函数。这bash
是一个内置函数,您可以在 bash 手册页 ( man bash
) 中找到有关它的信息。
本质上,您声明一个字符串来告诉getopts
需要什么参数,以及它们是否应该有参数。它getopts
处理成堆的参数(例如-abc
相当于-a -b -c
)和命令行的解析。在处理结束时,getopts
您可以根据需要处理命令行的其余部分。
典型的脚本片段可能看起来像这样
ARG_A= FLAG_B= FLAG_C=
while getopts 'a:bc' OPT # -a {argument}, -b, -c
do
case "$OPT" in
a) ARG_A="$OPTARG" ;;
b) FLAG_B=yes ;;
c) FLAG_C=yes ;;
*) echo "ERROR: the options are -a {arg}, -b, -c" >&2; exit 1 ;;
esac
done
shift $(($OPTIND - 1))
echo "Remaining command line: $*"
您可以添加?
为命令选项,如果您想要好的使用消息。请记住,在case
块中,您需要引用它或在其前面加上反斜杠,以便将其视为文字。
如果您想在没有内置命令的不同 shell 下运行它,或者您想使用长论证例如,--verbose
而不是-v
只看一下getopt
实用程序。这不是内置的,而是为了在更复杂的情况下提供而编写的。
答案2
您不必使用任何特定于 Bash 的功能来执行此操作:
#!/bin/sh
while true
do
case "$1" in
-a) echo Saw -a! ;;
-b) echo Saw -b! ;;
-c) echo Saw -c! ;;
-?) cat <<USAGE
usage: $0 [-a] [-b] [-c] args
You cannot currently combine options, as with -ac.
USAGE
exit 1
;;
*)
echo End of options!
break;
;;
esac
shift # toss current $1; we're done with it now
done
for p in "$@"
do
echo "Non-option argument: '$p'"
done
与中的代码不同罗艾玛的回答,我的是可移植的shell脚本代码。它可以在任何 Bourne 类型的 Unix shell 上运行,其历史可以追溯到 1980 年左右。
我认为-?
处理程序满足了您的“菜单”要求。该<<USAGE
构造称为特雷多克。