getopts
マニュアルページを読んでいますが、このユースケースについてはまだわかりません。
getopts
同じスクリプトで関数が2番目に呼び出されたときに使用可能なオプションが検出されませんでした。
私のデバッグ出力からわかるように、echo
すべての位置パラメータは両方の関数呼び出しに存在します。$@
2番目のcreate_db
関数呼び出しでは、getopts
whileループが入力されず、私の変数は設定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
# ...