bash - 如何在使用中转储数组中的所有元素

时间:2016-06-21 16:57:36

标签: bash shell

我想将我的数组转储给用户,以便他们可以看到映射的样子。我试着用这句话printf '%s\n' "${cluster_to_endpoint[@]}"尝试将其转储到下面的使用函数中,但是我没有得到我预期的输出。

正在进行的代码:

#!/bin/bash

set -e

usage () {
    echo "Usage: $0 -o oldcluster -n newcluster"
    printf '%s\n' "${cluster_to_endpoint[@]}"
}

while getopts ":o:n:" opt; do
  case $opt in
    o) old="$OPTARG";;
    n) new="$OPTARG";;
    *) usage
       exit 1
       ;;
  esac
done


# Mapping
declare -A cluster_to_endpoint=(
        [c1]=foobar2-01.us-east-1.my.com
        [c2]=foobar2-02.us-east-1.my.com
        [c3]=foobar2-03.us-east-1.my.com
        [c4]=foobar2-04.us-east-1.my.com)

# Echo info
echo "Source cluster:${cluster_to_endpoint[$old]}"
echo "Target cluster:${cluster_to_endpoint[$new]}"

输出:

-bash-4.1$ ./tst.sh -h
Usage: ./tst.sh -o oldcluster -n newcluster

期待:

Usage: ./tst.sh -o oldcluster -n newcluster

    [c1]=foobar2-01.us-east-1.my.com
    [c2]=foobar2-02.us-east-1.my.com
    [c3]=foobar2-03.us-east-1.my.com
    [c4]=foobar2-04.us-east-1.my.com

2 个答案:

答案 0 :(得分:3)

代码从上到下执行,当它进入while循环时,调用usage,它会尝试打印你的数组但尚未初始化。

在对任何访问权限之前放置声明语句。

答案 1 :(得分:1)

在初始化数组usage之前,您正在调用cluster_to_endpoint shell函数。

在处理命令行之前将declare语句移动到。

除此之外,数组中的下标必须求值为整数值,因此不能像c1那样等。 编辑显然,这就是你在Bash版本4+中执行关联数组的方法。较旧的Bash需要使用带有整数下标的普通数组(declare -a)。