我已经阅读了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:
答案1
每次你打电话获取选择,它使用$OPTIND;
如果应用程序将 OPTIND 设置为值 1,则可以使用一组新参数:当前位置参数或新的 arg 值。在单个 shell 执行环境中使用在所有调用中都不相同的参数(位置参数或 arg 操作数)或将 OPTIND 值修改为 1 以外的值的任何其他尝试多次调用 getopts 都会产生未指定的结果。
(我的重点)。每次调用 getopts 之前都需要重置 OPTIND,也许在这里:
# ...
# parse flags
OPTIND=1
while getopts 't:s:e:h' flag; do
# ...