2016-06-16 17 views
0

いくつかの検証を行うためのスクリプトを書いています。私は、すべてのパラメータが適切に格納されているかどうかを確認するために、複数のifを作成しようとしました。 これを進めるには良い方法か、これを達成するための別の戦略があるかどうかを知りたいと思います。この実装のもう一つの問題は、ユーザーがすべてのパラメータを入力していないとき、私のスクリプトはこれだけである場合は、最初の印刷していることである:次の検証を最適化する方法は?

Missing supplierCode 

私の完全なコードは次のようになります。より良い実装をするためのアイディアや提案を感謝したいと思います。

#!/bin/bash 
function menu() { 
     while (($# >= 1)) 
     do 
     key="$1" 
     case $key in 
       --supplierCode) 
       supplier_code=$2 
       shift 
       ;; 
       --vanID) 
       van_id=$2 
       shift 
       ;; 
       --vanIDp) 
       van_idp=$2 
       shift 
       ;; 
       --tgoID) 
       tgo_id=$2 
       shift 
       ;; 
       --tgoIDp) 
       tgo_idp=$2 
       shift 
       ;; 
       --company_name) 
       company_name=$2 

       shift 
       ;; 
       --ediFact) 
       file_type=E 
       ;; 
       --webEdi) 
       file_type=P 
       ;; 
       --PV) 
       pv=1 
       ;; 
       --PT) 
       pt=1 
       ;; 
       --help) 

       exit 
       ;; 
     esac 
     shift 
     done 
} 
function error() { 
     #Validations: 
    if [ -z "$supplier_code" ] 
     then 
       echo "Missing supplierCode" 
       exit 1 
     fi 

    if [ -z "$van_id" ] 
     then 
       echo "Missing vanID" 
       exit 1 
     fi 
    if [ -z "$van_idp" ] 
     then 
       echo "Missing vanIDp" 
       exit 1 
     fi 
    if [ -z "$tgo_id" ] 
     then 
       echo "Missing tgoID" 
       exit 1 
     fi 
    if [ -z "$tgo_idp" ] 
     then 
       echo "Missing tgoIDp" 
       exit 1 
     fi 
    if [ -z "$company_name" ] 
     then 
       echo "Missing company_name" 
       exit 1 
     fi 
    if [ -z "$file_type" ] 
     then 
       echo "Missing ediFact or webEdi" 
       exit 1 
     fi 
    if [ "$pv" -eq "0" ] && [ "$pt" -eq "0" ] 
     then 
       echo "Error: You have to use at least one of those flags --PV , --PT " 
       exit 1 
    fi 

} 
menu "[email protected]" 
error 
+0

まだあなたの質問に気をつけようとしています;-)一方、エラー機能で '$ van_idp'を無視しないように' p'を追加してください。それから私は、メニュー機能のエコーステートメントのノイズを削除します。あなたがshellcheck.netのようなオンラインのbash lintersを実行すると、あなたのスクリプトは大丈夫です。今本当の質問に...ああ簡単です。 ifチェックセクション... cfで終了呼び出しを削除します。私の答え。 – Dilettant

+0

この関数を使用してスクリプト引数を取得していますか?もしそうなら、代わりにgetoptsを使うべきです。これは非常に便利です。 [例](http://stackoverflow.com/a/37786981/2394026) - [チュートリアル](http://wiki.bash-hackers.org/howto/getopts_tutorial) – Flows

+0

私はgetoptsのためにそれをすることにしました ' 2つ以上の文字で構成されたフラグを許可しますが、提案に感謝します。 – neo33

答えて

4

これを試してみてください:最初のエラーで早期終了しますが、すべてのテストを超えるつもりはないこと、私の素敵な編集しない

#!/bin/bash 
function menu() { 
     while (($# >= 1)) 
     do 
     key="$1" 
     case $key in 
       --supplierCode) 
       supplier_code=$2 
       shift 
       ;; 
       --vanID) 
       van_id=$2 
       shift 
       ;; 
       --vanIDp) 
       van_idp=$2 
       shift 
       ;; 
       --tgoID) 
       tgo_id=$2 
       shift 
       ;; 
       --tgoIDp) 
       tgo_idp=$2 
       shift 
       ;; 
       --company_name) 
       company_name=$2 
       shift 
       ;; 
       --ediFact) 
       file_type=E 
       ;; 
       --webEdi) 
       file_type=P 
       ;; 
       --PV) 
       pv=1 
       ;; 
       --PT) 
       pt=1 
       ;; 
       --help) 

       exit 
       ;; 
     esac 
     shift 
     done 
} 
function error() { 
     #Validations: 
    is_valid=1 
    if [ -z "$supplier_code" ] 
     then 
       echo "Missing supplierCode" 
       is_valid=0 
     fi 

    if [ -z "$van_id" ] 
     then 
       echo "Missing vanID" 
       is_valid=0 
     fi 
    if [ -z "$van_idp" ] 
     then 
       echo "Missing vanIDp" 
       is_valid=0 
     fi 
    if [ -z "$tgo_id" ] 
     then 
       echo "Missing tgoID" 
       is_valid=0 
     fi 
    if [ -z "$tgo_idp" ] 
     then 
       echo "Missing tgoIDp" 
       is_valid=0 
     fi 
    if [ -z "$company_name" ] 
     then 
       echo "Missing company_name" 
       is_valid=0 
     fi 
    if [ -z "$file_type" ] 
     then 
       echo "Missing ediFact or webEdi" 
       is_valid=0 
     fi 
    if [ "$pv" -eq "0" ] && [ "$pt" -eq "0" ] 
     then 
       echo "Error: You have to use at least one of the flags --PV , --PT " 
       is_valid=0 
     fi 
    if [ "$is_valid" -eq 1 ] 
     then 
       printf "Here you could finally exit with code 2 (for user error), which we do.\n" 
       exit 2 
     fi 

} 
menu "[email protected]" 
error 

が、それはあなたが質問に示されている何をすべきと終了します(ここでは、使用法エラーコードとして2を返すという規則があります)。

PS:私の指はまた、しばしばechoと入力しますが、ほとんどの場合、私の心はprintfに決まります。同時に、「もの」を印刷するための汎用性と移植性が高いからです。フォーマット文字列があり、エコーするオプションはプラットフォームによって異なります。

+2

ありがとう、これは本当に創造的な解決策です、私はちょうどすべての欠落したパラメータで構成された文字列を構築するつもりです、私はユーモアの良い感謝とサポート、最高の点に感謝します。 – neo33

+1

エラーメッセージは、 'echo'や' printf'コマンドの後に '>&2'を標準エラーリダイレクトするように書くべきです。 –

関連する問題