排除 getopts-options 被 $@ 读入数组

Exclude getopts-options from being read into array by $@

我正在尝试使用以下用法制作脚本:

bash script.sh [-a] databases ...

脚本然后使用来自 'databases'

的参数填充数组 $databases
databases=("$@")

现在我正在尝试实现选项 -a,如果设置的话应该声明 att=1:

while getopts "a" o; do
    case "${o}" in
        a)
            att=1
            ;;
    esac
done

现在我面临的问题是在执行脚本时 -a 也被放入数组中。

我不能对数组使用 read,因为我无法在脚本执行后输入其他参数,因为脚本将使用 RMM 自动执行,并且只允许您输入创建作业时添加参数。

在填充变量之前,您必须在 case 块中使用 shift

while getopts "a" o; do
   case $o in
      a)
         att=1
         shift
         ;;
    esac
done

databases=("$@")
declare -p databases att

然后运行像这样:

bash script.sh -a DB1 DB2 DB3

输出:

declare -a databases=([0]="DB1" [1]="DB2" [2]="DB3")
declare -- att="1"

使用 getopts 管理选项的标准方法是执行全局 shift :

#!/usr/bin/env bash

while getopts "a" o; do
    case "${o}" in
    a) att=1 ;;
    esac
done
shift $((OPTIND - 1))

databases=("$@")

declare -p databases att
# output
# ./test.sh -a DB1 DB2 DB3
# declare -a databases=([0]="DB1" [1]="DB2" [2]="DB3")
# declare -- att="1"