我知道当我们使用 getopt 或 optparse 设置选项时,一个破折号会与一个字符对应。但无论如何,是否可以使用带有多个字符的单破折号,例如-apply
?
我知道一个破折号是指一个短名称,并且通常人们使用一个字符来表示它。但有一些命令(例如,find -printf
)使用带有单个破折号的长名称。
有谁知道如何在 Linux 上的 bash 中使用长名称和一个破折号(使用getopt
或optparse
其他 bash 工具)?
答案1
答案2
如果您有 GNU 系统,并且需要单破折号长选项,那么请务必使用getopt_long
或getopt -a
。
这个例子find -printf
让我注意到 GNU 扩展:find
在 GNU 系统之外也存在一划线选项,而且其传承可能比 GNU 风格的长选项要古老得多。因此,像这样的程序find
可能不使用getopt_long
,而只是手动解析它们的命令行选项。在 bash 中,它可能看起来像这样:
$ cat args.sh
#!/bin/sh
foo=0
bar=0
while [ "$#" -ne 0 ] ; do
if [ "$1" = "-foo" ] ; then
foo=1
elif [ "$1" = "-bar" ] ; then
shift
bar=$1
fi
shift
done
echo foo: "$foo"
echo bar: "$bar"
$ ./args.sh -bar x -foo
foo: 1
bar: x
答案3
解析单字符选项的困难在于它们可以被捆绑(例如-ab
相当于-a -b
)。 GNU 风格的长选项有一个困难,即参数可以连接也可以不连接。使用单破折号多字符选项,不存在任何解析困难,因此您可以轻松地手动完成。
大多数具有单破折号多字符选项的程序都在单独的命令行参数中接受参数。
foo=
bar=default
require_argument () {
if [ $# -eq 2 ]; then
echo >&2 "$0: Option $1 requires an argument"
exit 2
fi
eval "$1=\"\$3\""
}
while case "$1" in
--) shift; false;;
-foo) foo=1
-bar) require_argument bar "$@"; shift;;
-?*) echo >&2 "$0: Unknown option $1"; exit 2;;
*) false;;
esac
do
shift
done
请考虑使用 GNU 风格的长选项。他们的行为更加规范,也被更多的人所熟悉。