bash - 在 bash 脚本中将 getopts 与关联数组结合使用

bash - using getopts with an associative array in a bash script

我在下面的代码中使用 getoptsassociate array。 我不知道如何正确调用我的值,因为我要求使用相同标志的 (2) 个别名。

这是我目前的情况:

#!/bin/bash

set -e

usage () {
    echo "Usage: [=12=] -c alias1  -c alias2"
}

while getopts ":c:" opt; do
  case $opt in
    c) alias="$OPTARG";;
    *) echo "Error unknown option -$OPTARG"
       usage
       exit 1
       ;;
  esac
done

# Testing use off array
declare -A alias=( [alias1]=myhost-01.com \
                   [alias2]=myhost-02.com \
                   [alias3]=myhost-03.com \
                   [alias4]=myhost-04.com )

echo "This is my source host:${alias}"
echo "This is my target host:${alias}"

这是我想要执行它的方式(或更好的建议方式):

-bash-4.1$ ./test-array2.sh -c alias1 -c alias4
This is my source host:
This is my target host:

显然,我没有得到预期的结果:

This is my source host: myhost-01.com
This is my target host: myhost-04.com

我该怎么做?我想传入 (2) 个别名,它使用我的别名映射(关联数组)来获取正确的键值对,或者我的方法可能是错误的,我不能使用 -c 两次?谢谢。

您可以使用数组来存储别名,例如

aliases=()
while getopts ":c:" opt; do
    case $opt in
        c) aliases+=( "$OPTARG" );;
    # ...
    esac
done

然后你使用这个数组来索引你的关联数组:

echo "This is my source host:${alias_to_host[${aliases[0]}]}"
echo "This is my target host:${alias_to_host[${aliases[1]}]}"

但是,如果输入选项表示源主机和目标主机的别名,并且总是恰好有两个主机,那么使用单独的选项(例如 -s-d)会更简洁,并且将这些变量分开而不是重新使用开关 -c:

# ...
    case $opt in
        s) source=$OPTARG;;
        d) destination=$OPTARG;;
        # ...
    esac
# ...

echo "This is my source host:${alias_to_host[$source]}"
echo "This is my target host:${alias_to_host[$destination]}"