我想编写一个像git一样的命令行工具,它遵循POSIX
标准。它会采用--help
或-h
,--version
..等选项。但我没有得到如何做到这一点。任何人都可以告诉我如何使用bash脚本执行此操作。请帮我。这对我来说很新鲜。
示例:如果我的工具名称是Check-code,那么我想使用像;
这样的工具Check-code --help
或
Check-code --version
答案 0 :(得分:6)
据我所知,“长选项”,如--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
答案 1 :(得分:2)
您可以使用内置的'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
或--help
等长选项。在实践中,我从未发现这是一个重要的限制;任何足够复杂且需要长选项的脚本都可能是我用不同的语言编写的。
答案 2 :(得分:0)
可能有更好的方法可以做到这一点,但这是我认为有用的方法:
每个参数由BASH中的变量表示。第一个参数是$1
。第二个是$2
,依此类推。将选项字符串与第一个参数匹配,如果匹配,则相应地运行一些代码。
示例:
#!/bin/bash
if [ $1 == "--hello" ]
then
echo "Hello"
else
echo "Goodbye"
fi
如果您使用C或C ++编码,请使用**argv
变量。 **argv
是一个双指针,它包含传递给程序的所有参数的列表(argv[0]
是程序名称)。