2016-06-21 2 views
0

Я хотел бы сбросить мой массив пользователю, чтобы они могли видеть, как будут выглядеть сопоставления. Я попытался с этим утверждением printf '%s\n' "${cluster_to_endpoint[@]}" Я пытаюсь сбросить его в моей функции использования ниже, однако я не получаю вывод, который я ожидаю.bash - как сбрасывать все элементы в массиве в пределах использования

Код в процессе:

#!/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 
+4

У вас будет больше шансов получить ожидаемый результат, если вы создадите массив * до того, как вы попытаетесь его распечатать. – rici

ответ

3

Код выполняется сверху вниз, а когда он входит в цикл while, вызывает использование, которое пытается распечатать массив, но оно еще не было инициализировано.

Положите инструкцию declare перед любым доступом к ней.

1

Вы вызываете вашу функцию usage оболочки перед инициализацией массива cluster_to_endpoint.

Переведите оператор declare перед использованием командной строки.

В дополнение к этому индексы в массиве должны оцениваться с целыми значениями и поэтому не могут быть c1 и т. Д., Как у вас есть. EDIT Видимо, так вы делаете ассоциативные массивы в Bash версии 4+. Старое Bash должно использовать обычные массивы (declare -a) с целыми индексами.

+0

'declare -A' объявляет ассоциативный массив в Bash 4+. Они снабжены строками. –

+0

Это правда, забыли сказать, что я должен был перейти на '-a' для' bash', который я запускал. Если он работает в вашей версии 'bash', то идите с этим. Ping @noober – Kusalananda

+0

понял! спасибо за помощь – noober

Смежные вопросы