我想编写一个命令行工具,如git,它将遵循POSIX
标准。它将采取像--help
或-h
,--version
..等等的选项。但我没有得到如何去做。任何人都可以告诉我如何使用bash脚本来做到这一点。请帮帮我。这对我来说是非常新鲜的东西。如何使用bash编写命令行工具
例如:如果我的工具的名称是检查代码,那么我想使用工具;
Check-code --help
或
Check-code --version
我想编写一个命令行工具,如git,它将遵循POSIX
标准。它将采取像--help
或-h
,--version
..等等的选项。但我没有得到如何去做。任何人都可以告诉我如何使用bash脚本来做到这一点。请帮帮我。这对我来说是非常新鲜的东西。如何使用bash编写命令行工具
例如:如果我的工具的名称是检查代码,那么我想使用工具;
Check-code --help
或
Check-code --version
有可能是一个更好的方式来做到这一点,但这里是我发现有用: 每个参数由BASH的变量表示。第一个参数是$1
。第二个是$2
,依此类推。将选项字符串与第一个参数匹配,如果匹配,则相应地运行一些代码。
实施例:
#!/bin/bash
if [ $1 == "--hello" ]
then
echo "Hello"
else
echo "Goodbye"
fi
如果在C或C++代码,然后使用**argv
变量。 **argv
是一个双指针,它包含传递给程序的所有参数的列表(其中argv[0]
是程序名)。
感谢您的答复。我认为我们可以使用bash命令“getopt “。你能否使用它来提出上述解决方案。但我不知道它是否适用于“-h”和“--help”格式 – user1497818 2013-03-14 11:18:51
如果使用Bourne shell风格'test'(''''你应该引用''$ 1“'''。使用'[['不需要围绕变量引号(但仍需要引用包含空格的文本)“。 – cdarke 2013-03-14 13:11:42
据我所知,“长选项”,如--help
和--version
不是POSIX标准,而是GNU标准。对于命令行实用程序,POSIX标准说:
由连字符和单个字母或数字(如'a')组成的参数称为“选项”(或历史上的“标志”)。
为了支持POSIX短期选项,值得了解getopts
(网上有教程),但它不支持GNU long选项。
对于你滚长选项你自己:
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
我认为这可以成为实现多种选择的途径之一。使用getopt可以使我们简短并且适用于短期和长期期权 – user1497818 2013-03-14 11:40:12
@ user1497818:非常困难,我看不到使用带有长选项的'getopts'的方法。你可能更适合使用Perl和'Getopt :: Long' http://perldoc.perl.org/Getopt/Long.html – cdarke 2013-03-14 13:17:30
你可以在案例中检测到一个破折号,并通过$ opt和$ 1(如果存在该选项的一个参数)来让它处理。获得的唯一优点是能够处理作为一组传递的多个单字母选项(例如-ine == -i -n -e)。我从来没有任何人请求过我编写的任何工具的能力,所以我从来没有打扰过支持它。长/短的 – William 2013-03-14 14:11:29
您可以使用“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
这样的长期选项。在实践中,我从来没有发现这是一个重大的限制;任何足够复杂的脚本都需要很长的选项,这可能是我用另一种语言编写的东西。
男人bash?或者买书? – 2013-03-14 10:56:34
http://stackoverflow.com/questions/8533029/bash-multiple-command-line-arguments-dependent-on-each-other?rq=1 – 2013-03-14 10:57:42