Bash
在腳本中多次呼叫的函式中的 getopts,getopts 在第一次函式呼叫後未檢測到任何 opts
我已經閱讀了
getopts
手冊頁,但仍然不確定這個案例。
getopts
在同一腳本中第二次呼叫函式時未檢測到任何可用選項。從我的調試
echo
輸出中可以看出$@
,兩個函式呼叫都存在所有位置參數。在第二個
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:
每次呼叫getopts時,它都會使用 $OPTIND;
如果應用程序將 OPTIND 設置為值 1,則可以使用一組新參數:目前位置參數或新 arg 值。任何其他嘗試在單個 shell 執行環境中使用在所有呼叫中都不相同的參數(位置參數或 arg 操作數)或將 OPTIND 值修改為 1 以外的值來多次呼叫 getopts,都會產生未指定的結果。
(我的重點)。您需要在每次呼叫 getopts 之前重置 OPTIND,也許在這裡:
# ... # parse flags OPTIND=1 while getopts 't:s:e:h' flag; do # ...