5

POSIX標準に従うgitのようなコマンドラインツールを書きたいです。--helpor など-hのオプションを取ります--version。しかし、私はそれを行う方法がわかりません。bash スクリプトを使用してこれを行う方法を教えてください。私を助けてください。これは私にとって非常に新しいことです。

例: ツールの名前が Check-code の場合、次のようなツールを使用したい。

Check-code --help 

また

Check-code --version
4

3 に答える 3

7

私の知る限り、「長いオプション」は POSIX 標準--help--versionはなく、GNU 標準です。コマンドライン ユーティリティの場合、POSIX 標準では次のように規定されています。

ハイフンと 1 文字または数字 (「a」など) で構成される引数は、「オプション」(歴史的には「フラグ」) として知られています。

POSIX の短いオプション オプションをサポートするには、知っておく価値がありますgetopts(Web にチュートリアルがあります) が、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

-helpこれは、やのような長いオプションではなく、1 文字のオプションでのみ機能します--help。実際には、これが重大な制限であることに気付いたことはありません。長いオプションを必要とするほど複雑なスクリプトは、おそらく私が別の言語で書くものです。

于 2013-03-14T11:56:17.200 に答える
0

これを行うにはおそらくもっと良い方法がありますが、私が便利だと思う方法は次のとおりです。各引数は、BASH の変数で表されます。最初の引数は$1. 2 番目は$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 に答える