bash - 在bash脚本中使用带有关联数组的getopts

时间:2016-04-30 17:49:16

标签: arrays bash shell getopts

我在下面的代码中使用了typedef std::vector<int> station2; getopts。 我无法弄清楚的是如何正确调用我的值,因为我要求(2)使用相同标志的别名。

这是我到目前为止所拥有的:

associate array

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

#!/bin/bash

set -e

usage () {
    echo "Usage: $0 -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:

我该怎么做?我想传入(2)别名,它使用我的别名映射(关联数组)来获取正确的键值对,或者我的方法可能是错误的,我不能两次使用This is my source host: myhost-01.com This is my target host: myhost-04.com ?感谢。

1 个答案:

答案 0 :(得分:2)

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

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

然后使用this数组索引关联数组:

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]}"