如何使用bash编写命令行工具

时间:2013-03-14 10:53:25

标签: bash

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

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

这样的工具
Check-code --help 

Check-code --version

3 个答案:

答案 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]是程序名称)。