2016-03-25 7 views
3

私は3つのコマンドライン引数を受け付けるbashスクリプトを持っています。例えば、スクリプトはscript -c <value> -h <value> -w <value>のように実行されます。引数のcaseコマンドを使用してコマンドライン引数を解析するコーナーケースを処理する適切な方法

  • 順序は引数は、引数のいずれかが不足している場合は、エラーメッセージが
  • を印刷された値を、持っていない場合、エラーメッセージがある
  • 重要ではありません:私はことを保証したいと思います未知の引数が存在する場合、エラーメッセージが

私はcase文を次のようにこれを達成を

  • 印刷された印刷物:

    #!/bin/bash 
    
    while :; do 
        case "$1" in 
        -h) 
         [[ x${2%%-*} != x ]] || { echo "Value for "$1" missing!"; exit 1; } 
         host="$2" 
         shift 2 
        ;; 
        -w) 
         [[ x${2%%-*} != x ]] || { echo "Value for "$1" missing!"; exit 1; } 
         warning="$2" 
         shift 2 
        ;; 
        -c) 
         [[ x${2%%-*} != x ]] || { echo "Value for "$1" missing!"; exit 1; } 
         critical="$2" 
         shift 2 
        ;; 
        "") 
         [[ $host && $warning && $critical ]] || { echo "One of the arguments is missing!"; exit 1; } 
         break 
        ;; 
        *) 
         echo "Unknow option" 
         exit 1 
        ;; 
        esac 
    done 
    

    しかし、caseには、[[ ]]のすべてのテストを回避できる高度なオプションがあります。上記のようなコーナーケースもカバーしたい場合は、コマンドライン引数を処理するために別のメソッドを使用する必要がありますか?

  • +0

    通常、これらのようなものが[のgetopt](http://man7.org/linux/man-pages/man1/getopt.1によって確認されています.html) – user3159253

    +0

    こちらの例をご覧ください。http://stackoverflow.com/questions/16483119/example-of-how-to-use-getopts-in-bash – user3159253

    +2

    [Bash FAQ 035](http://mywiki.wooledge。 org/BashFAQ/035)とページがリンクされています。 –

    答えて

    0

    other waysもありますが、理想的にはgetoptsの組み込みを使用してください。 Getoptsは最もポータブルで読みやすいオプションで、 "コーナーケース"のすべてをほぼ自動的に処理します。

    while getopts c:h:w: arg; do 
        case $arg in 
        (c) critical="$OPTARG" ;; 
        (h) host="$OPTARG" ;; 
        (w) warning="$OPTARG" ;; 
        (\?) exit 2 ;; 
        esac 
    done 
    shift $((OPTIND-1)) 
    
    if [ -z "$critical" ] || [ -z "$host" ] || [ -z "$warning" ]; then 
        echo "One of the arguments is missing!" 
        exit 1 
    fi 
    

    各オプションの後には、必須の引数があることを示すコロンが続きます。引数を使用しないフラグがある場合は、オプションの後にコロンを付けないでください。 POSIX getoptsはオプションの引数を持つオプションをサポートしていません。

    は、この質問についてsupporting long options、引数のネストされたcaseスイッチによって解析され-オプションに過ぎないキーにもmy answer参照してください。この方法で実装された長いオプションは、実際にはオプションの引数をサポートできます。

     

    私は助けを-hを過負荷の大ファンです。 getoptsループの前にこれを入れて、あなたはヘルプ機能を持っていると仮定すると:

    # when the sole argument is -h, provide help 
    if [ "$*" = "-h" ]; then 
        help 
        exit 0 
    fi 
    
    関連する問題