2013-04-24 20 views
6

bashでgetoptsを使用してコマンドライン引数を処理しようとしています。要件の1つは、任意の数のオプション引数(引用符を使用しない)の処理です。getopts(bash)を使用した複数のオプション引数

第一例(唯一の第一引数をつかむ)

madcap:~/projects$ ./getoptz.sh -s a b c 
-s was triggered 
Argument: a 

第二例(私はそれがこのように振る舞うしたいが、引数「

madcap:~/projects$ ./getoptz.sh -s "a b c" 
-s was triggered 
Argument: a b c 

を引用することなく、への道があります?

#!/bin/bash 
while getopts ":s:" opt; do 
    case $opt in 
    s) echo "-s was triggered" >&2 
     args="$OPTARG" 
     echo "Argument: $args" 
     ;; 
    \?) echo "Invalid option: -$OPTARG" >&2 
     ;; 
    :) echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 
:これは

ここで私が今持っているコードですん

+2

これが役立つことがあります。http://stackoverflow.com/a/7530327/1983854 – fedorqui

+0

詳細が必要です。 'getoptz.sh -s a -b c'が与えられたら、どんな振る舞いをしたいですか? '-b'は' -s'の引数ですか、 '-'は新しいオプションを示していますか? –

+0

[オプションの異なるさまざまなプログラムをそれぞれのオプションに対して呼び出す](http://stackoverflow.com/questions/15442950/)に関連するが、これに限定されない。一般的に、標準コマンドインタフェースのガイドライン(POSIXユーティリティの規約)を使用することが最善です(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html) –

答えて

3

コマンドライン引数を自分で解析することはできますが、getoptsコマンドを単一のオプションに対する複数の引数を認識するように構成することはできません。 fedorqui's recommendationは良い代替手段です。ここで

はオプションを自分で解析する1つの方法です:

while [[ "$*" ]]; do 
    if [[ $1 = "-s" ]]; then 
     # -s takes three arguments 
     args="$2 $3 $4" 
     echo "-s got $args" 
     shift 4 
    fi 
done 
+0

実際、「単一のオプションに複数の引数を認識させる」というのは、オプションは繰り返すことはできません。答えに例を付け加えました。私はそれが本当に欲しいものだと思うからです。 – mivk

11

私が何をしたいことは1つのオプションから値の一覧を取得することだと思います。そのためには、オプションを必要なだけ何度も繰り返すことができ、その引数を配列に追加することができます。

#!/bin/bash 

while getopts "m:" opt; do 
    case $opt in 
     m) multi+=("$OPTARG");; 
     #... 
    esac 
done 
shift $((OPTIND -1)) 

echo "The first value of the array 'multi' is '$multi'" 
echo "The whole list of values is '${multi[@]}'" 

echo "Or:" 

for val in "${multi[@]}"; do 
    echo " - $val" 
done 

出力は次のようになります。

$ /tmp/t 
The first value of the array 'multi' is '' 
The whole list of values is '' 
Or: 

$ /tmp/t -m "one arg with spaces" 
The first value of the array 'multi' is 'one arg with spaces' 
The whole list of values is 'one arg with spaces' 
Or: 
- one arg with spaces 

$ /tmp/t -m one -m "second argument" -m three 
The first value of the array 'multi' is 'one' 
The whole list of values is 'one second argument three' 
Or: 
- one 
- second argument 
- three 
関連する問題