BASH getoptsオプションの後の追加パラメータ

BASH getoptsオプションの後の追加パラメータ

-hオプションの後にgetoptsが2つの引数を受け入れるようにするにはどうすればよいですか?私の言葉は配列に保存する必要がありますが、うまくいかない、または次のような間違いをしていることを意味します。 echo "${array[1]} ${array[2]}"

 OPTIND=1 
    hh=
    while getopts "h:" flag
    do
    case "$flag" in
    h)
    hh=($OPTARG)  ;;
   esac
   done
   shift "$((OPTIND-1))"

答え1

-h一つの方法は何度も渡すことです。

OPTIND=1 
hh=()
while getopts h: flag; do
  case "$flag" in
    h) hh+=("$OPTARG");;
  esac
done
shift "$((OPTIND-1))"

そしてそれを呼び出す:

myscript -h host1 -h host2...

答え2

これは不可能です。あなたができることは、適切な区切り文字で引用され、区切られた2つの引数を渡し、分割してOPTARG2つの部分を得ることです。

可能な呼び出し構文の例は次のとおりです。

prog -h part1:part2

prog -h "part1 part2"

宣言では、caseたとえば、コロン区切り文字の場合、次のようにコンポーネントを分割できます。

p1=${OPTARG%:*} p2=${OPTARG#*:}

part1編集(説明):「適切な区切り記号」は、単一/コンポーネントに属さない区切り文字であるため、複合内part2で一意であるため、OPTARG分割はあいまいではありません。

答え3

短い答え:getoptsこの方法では使用されません。

長い答え:次のことを試すことができますが(テストされていません)、getopts構文チェックは実行されません。

OPTIND=1 
hh=()
args=( "$@" )
while getopts "h:" flag; do
  case "$flag" in
  h)
    hh=("$OPTARG" "${args[$OPTIND]}")
    $((OPTIND++))
    ;;
  esac
done
shift "$((OPTIND-1))"

このパスを使用する場合は、独自のエラー処理を追加する必要があります。たとえば、2番目のパラメータが存在しない、空、またはパラメータではないオプションのように見えます。

関連情報