2017-04-27 11 views
1

バッシュ別のコマンドのパラメータをラップ

別のコマンドのパラメータをラップは、私は、引数をこのように解析するコマンドtool1を持っています。したがって、tool2は、tool1にパラメータを渡す必要があります。それも

tool2--user)同じパラメータを処理する必要があるかもしれませんが以下のようになります。 --option2を要約すると

#!/usr/bin/env bash 
# ... 
while [[ $# -ge 1 ]] 
do 
     key="$1" 
     case $key in 
       -O|--option2) 
       opt2="$2" 
       shift 
       ;; 

       -u|--user) 
       USR="$2" 
       OTHERS+=("-u $2") 
       shift 
       ;; 

       -*) 
       echo -e "Unrecognized option: \"$key\"" && exit 1 
       ;; 
       *) 
       OTHERS+=("$1") 
       ;; 
     esac 
     shift 
done 

## Call tool1 with other parameters to pass 
bash tool1.sh ${OTHERS[@]} 
# ... 

のみtool2によって使用されるオプションです。 --userは両方のツールに共通であり、tool1.shを呼び出す前にtool2でも使用できます。このため、この例では--userを配列OTHERSのおかげでtool1に明示的に渡す必要があります。

このようなパラメータの冗長性を処理する可能性のある方法や代替方法について知りたいと思います。このような冗長なパラメータ/オプションの解析に関する行をコピー/ペーストすることなく、別のツールの予想されるパラメータ/オプションをラップするのに役立つ方法論。

+0

なぜ 'getopt'組み込み関数を使用しないのですか? – jehutyy

+0

移植性の問題について。 'getopt'は標準化されていません。しかし、 'getopts'は長いオプションをサポートしていません。 – kaligne

+0

オプションが2番目のスクリプトにあり、最初のスクリプトではない場合はどうなりますか?また、両方のスクリプトがパラメータに作用できる場合、どのように冗長性がありますか? – 123

答えて

1

tool2のアプローチは問題ありません。ただし、OTHERSは正しく設定されていません。

-u|--user) 
    USR="$2" 
    OTHERS+=("-u" "$2") 
    shift 

-uとその引数彼らはtool2に別々の引数たと同じように、別の配列要素を維持する必要があります。あなたはまた、単語分割文字やグロブを含む引数を維持するために、OTHERSの拡大を引用する必要があります。

bash tool1.sh "${OTHERS[@]}" 

最後に、すべて大文字の変数名は、シェル自身が使用するために予約されています。そのような名前を自分で定義しないでください。 OTHERSの代わりにothersを使用してください。

+0

洞察に感謝します。エクスポートされた変数の名前を大文字にしても問題ありません。 – kaligne

+0

「資本化する」とは、「その他」を意味します。ただし、大文字のみの変数は作成しないでください。変数をエクスポートするかどうかは関係ありません。 – chepner

+0

いくつかの公式文書でOKです私は個人的な大文字変数(OTHER)を宣言することは、上記の変数がエクスポートされている場合にのみ関係があることを読みました。 – kaligne