2013-03-14 103 views
2

我想编写一个命令行工具,如git,它将遵循POSIX标准。它将采取像--help-h,--version ..等等的选项。但我没有得到如何去做。任何人都可以告诉我如何使用bash脚本来做到这一点。请帮帮我。这对我来说是非常新鲜的东西。如何使用bash编写命令行工具

例如:如果我的工具的名称是检查代码,那么我想使用工具;

Check-code --help 

Check-code --version 
+2

男人bash?或者买书? – 2013-03-14 10:56:34

+1

http://stackoverflow.com/questions/8533029/bash-multiple-command-line-arguments-dependent-on-each-other?rq=1 – 2013-03-14 10:57:42

回答

0

有可能是一个更好的方式来做到这一点,但这里是我发现有用: 每个参数由BASH的变量表示。第一个参数是$1。第二个是$2,依此类推。将选项字符串与第一个参数匹配,如果匹配,则相应地运行一些代码。

实施例:

#!/bin/bash 
if [ $1 == "--hello" ] 
    then 
     echo "Hello" 
    else 
     echo "Goodbye" 
fi 

如果在C或C++代码,然后使用**argv变量。 **argv是一个双指针,它包含传递给程序的所有参数的列表(其中argv[0]是程序名)。

+0

感谢您的答复。我认为我们可以使用bash命令“getopt “。你能否使用它来提出上述解决方案。但我不知道它是否适用于“-h”和“--help”格式 – user1497818 2013-03-14 11:18:51

+0

如果使用Bourne shell风格'test'(''''你应该引用''$ 1“'''。使用'[['不需要围绕变量引号(但仍需要引用包含空格的文本)“。 – cdarke 2013-03-14 13:11:42

4

据我所知,“长选项”,如--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 
+0

我认为这可以成为实现多种选择的途径之一。使用getopt可以使我们简短并且适用于短期和长期期权 – user1497818 2013-03-14 11:40:12

+0

@ user1497818:非常困难,我看不到使用带有长选项的'getopts'的方法。你可能更适合使用Perl和'Getopt :: Long' http://perldoc.perl.org/Getopt/Long.html – cdarke 2013-03-14 13:17:30

+1

你可以在案例中检测到一个破折号,并通过$ opt和$ 1(如果存在该选项的一个参数)来让它处理。获得的唯一优点是能够处理作为一组传递的多个单字母选项(例如-ine == -i -n -e)。我从来没有任何人请求过我编写的任何工具的能力,所以我从来没有打扰过支持它。长/短的 – William 2013-03-14 14:11:29

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这样的长期选项。在实践中,我从来没有发现这是一个重大的限制;任何足够复杂的脚本都需要很长的选项,这可能是我用另一种语言编写的东西。