スクリプトで何度も呼び出される関数の getopts、getopts は、最初の関数呼び出し以降のオプションは検出しません。

スクリプトで何度も呼び出される関数の getopts、getopts は、最初の関数呼び出し以降のオプションは検出しません。

getoptsマニュアルページを読んでいますが、このユースケースについてはまだわかりません。

getopts同じスクリプトで関数が2番目に呼び出されたときに使用可能なオプションが検出されませんでした。

私のデバッグ出力からわかるように、echoすべての位置パラメータは両方の関数呼び出しに存在します。$@

2番目のcreate_db関数呼び出しでは、getoptswhileループが入力されず、私の変数は設定TYPEされませENVIRONん。

どんなアイデアがありますか?

関数定義( create_db)

function create_db {
  local TYPE SIZE ENVIRON
  TYPE=''
  SIZE=''
  ENVIRON=''

  print_usage() {
    echo -e $"\nUsage: create_db -t {mysql|redis|rabbitmq|sftp|elasticsearch} -e <environment_name> -s <size_in_GB>"
    echo "Required args: -t, -e"
    echo "Optional args: -s"
  }

  echo "@: $@"
  echo "0: $0"
  echo "1: $1"
  echo "2: $2"
  echo "3: $3"
  echo "4: $4"
  echo "5: $5"
  echo "6: $6"

  # parse flags
  while getopts 't:s:e:h' flag; do
    echo "flag: $flag"
    echo "opt: ${OPTARG}"
    case "${flag}" in
      t) TYPE="${OPTARG}" ;;
      s) SIZE="${OPTARG}" ;;
      e) ENVIRON="${OPTARG}" ;;
      h) print_usage
         exit 0 ;;
      *) print_usage >&2
         exit 1 ;;
    esac
  done
  shift "$(( OPTIND - 1 ))"

  echo "TYPE: ${TYPE}"
  echo "ENVIRON: ${ENVIRON}"

  ... DO WORK ...

}

environment-setup-from-scratch.shスクリプト()が呼び出されました

#!/bin/bash

# import functions from utils file
. "${0%/*}/environment-setup-utils.sh"

ENVIRONMENT="${1}"

create_db -t "elasticsearch" -e "${ENVIRONMENT}"
create_db -t "mysql" -e "${ENVIRONMENT}"
create_db -t "redis" -e "${ENVIRONMENT}"

端子出力

$ ./environment-setup-from-scratch.sh  sandbox


@: -t elasticsearch -e sandbox
0: ./environment-setup-from-scratch.sh
1: -t
2: elasticsearch
3: -e
4: sandbox
5:
6:
flag: t
opt: elasticsearch
flag: e
opt: sandbox
TYPE: elasticsearch
ENVIRON: sandbox


@: -t mysql -e sandbox
0: ./environment-setup-from-scratch.sh
1: -t
2: mysql
3: -e
4: sandbox
5:
6:
TYPE:
ENVIRON:

答え1

電話するたびに選択項目のインポート、 $OPTIND を使用します。

アプリケーションがOPTIND値を1に設定すると、新しいパラメーター・セット(現在のロケーション・パラメーターまたは新しい引数値)を使用できます。すべての呼び出しで異なる、またはOPTIND値を1以外の値に変更する引数(位置引数または引数オペランド)を使用して、単一シェル実行環境でgetoptsを複数回呼び出そうとする他の試みは、未指定の結果を生成します。

(私の強調)。 OPTINDはgetoptsを呼び出す前にリセットする必要があります。おそらく次のようになります。

# ...
  # parse flags
  OPTIND=1
  while getopts 't:s:e:h' flag; do
# ...

関連情報