Bash

在腳本中多次呼叫的函式中的 getopts,getopts 在第一次函式呼叫後未檢測到任何 opts

  • June 15, 2019

我已經閱讀了getopts手冊頁,但仍然不確定這個案例。

getopts在同一腳本中第二次呼叫函式時未檢測到任何可用選項。

從我的調試echo輸出中可以看出$@,兩個函式呼叫都存在所有位置參數。

在第二個create_db函式呼叫中,getopts從未輸入過 while 循環,導致我的變數TYPEENVIRON沒有被設置。

有什麼想法嗎?

功能定義 ( 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
# ...

引用自:https://unix.stackexchange.com/questions/525048