我想编写一个命令行工具,如 git 它将遵循POSIX
标准。它将采用--help
or -h
, --version
..etc 之类的选项。但我不知道该怎么做。谁能告诉我如何使用 bash 脚本来做到这一点。请帮我。这对我来说非常新鲜。
示例:如果我的工具名称是 Check-code,那么我想使用该工具,例如;
Check-code --help
或者
Check-code --version
我想编写一个命令行工具,如 git 它将遵循POSIX
标准。它将采用--help
or -h
, --version
..etc 之类的选项。但我不知道该怎么做。谁能告诉我如何使用 bash 脚本来做到这一点。请帮我。这对我来说非常新鲜。
示例:如果我的工具名称是 Check-code,那么我想使用该工具,例如;
Check-code --help
或者
Check-code --version
据我所知,“长选项”类似于--help
并且--version
不是 POSIX 标准,而是 GNU 标准。对于命令行实用程序,POSIX 标准说:
由连字符和单个字母或数字组成的参数,例如“a”,称为“选项”(或历史上的“标志”)。
要支持 POSIX 短选项值得了解getopts
(网上有教程),但它不支持 GNU 长选项。
对于长选项,您必须自己滚动:
filename=default
while (( $# > 0 ))
do
opt="$1"
shift
case $opt in
--help)
helpfunc
exit 0
;;
--version)
echo "$0 version $version"
exit 0
;;
--file) # Example with an operand
filename="$1"
shift
;;
--*)
echo "Invalid option: '$opt'" >&2
exit 1
;;
*)
# end of long options
break;
;;
esac
done
您可以使用内置的“getopts”,如下所示:
#!/bin/bash
# Parse arguments
usage() {
echo "Usage: $0 [-h] [-v] [-f FILE]"
echo " -h Help. Display this message and quit.
echo " -v Version. Print version number and quit.
echo " -f Specify configuration file FILE."
exit
}
optspec="hvf:"
while getopts "$optspec" optchar
do
case "${optchar}" in
h)
usage
;;
v)
version
;;
f)
file=${OPTARG}
;;
*)
usage
;;
esac
done
这仅适用于单字符选项,不适用于像-help
or之类的长选项--help
。在实践中,我从未发现这是一个重大限制。任何复杂到需要长选项的脚本都可能是我会用不同的语言编写的。
可能有更好的方法来做到这一点,但我发现这里很有用:每个参数都由 BASH 中的一个变量表示。第一个论点是$1
。第二个是$2
,以此类推。将选项字符串与第一个参数匹配,如果匹配,则相应地运行一些代码。
例子:
#!/bin/bash
if [ $1 == "--hello" ]
then
echo "Hello"
else
echo "Goodbye"
fi
如果您使用 C 或 C++ 编写代码,请使用该**argv
变量。 **argv
是一个双指针,它包含传递给程序的所有参数的列表(argv[0]
作为程序名称)。