5

我想编写一个命令行工具,如 git 它将遵循POSIX标准。它将采用--helpor -h, --version..etc 之类的选项。但我不知道该怎么做。谁能告诉我如何使用 bash 脚本来做到这一点。请帮我。这对我来说非常新鲜。

示例:如果我的工具名称是 Check-code,那么我想使用该工具,例如;

Check-code --help 

或者

Check-code --version
4

3 回答 3

7

据我所知,“长选项”类似于--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
于 2013-03-14T11:33:38.230 回答
3

您可以使用内置的“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

这仅适用于单字符选项,不适用于像-helpor之类的长选项--help。在实践中,我从未发现这是一个重大限制。任何复杂到需要长选项的脚本都可能是我会用不同的语言编写的。

于 2013-03-14T11:56:17.200 回答
0

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

例子:

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

如果您使用 C 或 C++ 编写代码,请使用该**argv变量。 **argv是一个双指针,它包含传递给程序的所有参数的列表(argv[0]作为程序名称)。

于 2013-03-14T11:04:53.047 回答