2017-09-19 22 views
1

次のようなbashシェルスクリプトへの入力を解析できるようにしたいと考えています。bashスクリプトの引数を複数の値で保存する

myscript.sh --casename obstacle1 --output en --variables v P pResidualTT 

最後の引数には複数の値があるので、これまでのところこれまでに失敗しました。最初の引数は1つだけの値を持つべきですが、3番目の引数は1より大きい値を持つことができます。次の " - "までの3番目の引数の後のすべてを取得するように指定する方法はありますか?私はユーザーが私が示した順序で引数を与えるように制約されていないと仮定しよう。

casename=notset 
variables=notset 
output_format=notset 
while [[ $# -gt 1 ]] 
do 
    key="$1" 
    case $key in 
     --casename) 
     casename=$2 
     shift 
     ;; 
     --output) 
     output_format=$2 
     shift 
     ;; 
     --variables) 
     variables="$2" 
     shift 
     ;; 
     *) 
     echo configure option \'$1\' not understood! 
     echo use ./configure --help to see correct usage! 
     exit -1 
     break 
     ;; 

    esac 
    shift 
done 

echo $casename 
echo $output_format 
echo $variables 
+0

、ん '--variab lesは2または3の値を持っていますか?答えが「2」の場合、スクリプトがパラメータ値( '' v''と '' '')と非パラメータ値( '' pResidualTT')を区別するために、どのように期待しますか?どのようにスクリプトの後ろにある複数値のパラメータを参照することを計画していましたか?値の配列をループしますか?連結された値の変数を解析しますか? – markp

+0

3番目の引数は変数にダンプされ、その3番目の引数の個々のコンポーネントを解析する方法を知っている別のスクリプトに直接渡されます。 – wandadars

答えて

4

一つの従来の方法は、(場合は、これをやろうとしている)複数の引数をオフにシフトすることです。それは次のとおりです、それはそう、発信者が1 -Vまたは次の変数ごと--variable引数を渡すあなたの呼び出し規約を構築するために、より一般的だと述べて

variables=() 
case $key in 
    --variables) 
    while (("$#" >= 2)) && ! [[ $2 = --* ]]; do 
     variables+=("$2") 
     shift 
    done 
    ;; 
esac 

- つまり、のようなもの:

myscript --casename obstacle1 --output en -V=v -V=p -V=pResidualTT 
をあなただけの必要がある場合には

...:あなたの例では

case $key in 
    -V=|--variable=) variables+=("${1#*=}");; 
    -V|--variable) variables+=("$2"); shift;; 
esac 
関連する問題