2016-08-05 5 views
1

Возможно ли создать массив объектов в bash?Создание массива объектов в bash

Вот как я пытаюсь:

declare -a identifications=(
    { 
    email = '...', 
    password = '...' 
    } 
) 

declare -a years=(
    '2011' 
    '2012' 
    '2013' 
    '2014' 
    '2015' 
    '2016' 
) 

for identification in "${identifications[@]}" 
do 
    for year in "${years[@]}" 
    do 
    my_program --type=CNPJ --format=XLS --identification=${identification.email} --password=${identication.password} --competence=${year} --output="$identification - $year" 
    done 
done 

Очевидно, что это не работает, и я не найти, как добиться этого, так как я не найти объекты Баш.

+0

'bash' имеет только один тип данных: строка. Даже массивы - это просто еще одна форма синтаксического цитирования, позволяющая списки строк, содержащих произвольные значения (т. Е. Пробельные символы). (Ассоциативные массивы, введенные в 'bash' 4, немного лучше, но все еще не там, где достаточно, чтобы разрешить типы структур данных, которые вы ищете.) – chepner

+0

' ksh93' и более поздние поддерживающие переменные, определенные по описанию. К сожалению, 'ksh', похоже, оставлен, так как даже man-страницы, на которые указывает kornshell.com, теперь являются мертвыми ссылками (и были на некоторое время). И я не смог бы указать вам документацию о том, как использовать ваш ksh для этой функции. (Его, вероятно, где-то там). Удачи. – shellter

ответ

4

Вы могли бы сделать некоторые фокусы с associative arrays (введен в Bash 4.0) и namerefs (смотрите руководство для declare и первый абзац Shell Parameters – введен в Bash 4.3):

#!/bin/bash 

declare -A identification0=(
    [email]='[email protected]' 
    [password]='admin123' 
) 
declare -A identification1=(
    [email]='[email protected]' 
    [password]='passwd1!' 
) 

declare -n identification 
for identification in ${[email protected]}; do 
    echo "Email: ${identification[email]}" 
    echo "Password: ${identification[password]}" 
done 

Печатается

Email: [email protected] 
Password: admin123 
Email: [email protected] 
Password: passwd1! 

declare -A объявляет ассоциативный массив.

Хитрость заключается в назначении всех имен переменных «объекты» (ассоциативных массивов), начинающихся с того же префикса, например identification. ${[email protected]} обозначения расширяется до всех имен переменных, начиная с prefix:

$ var1= 
$ var2= 
$ var3= 
$ echo ${[email protected]} 
var1 var2 var3 

Затем, чтобы получить доступ к пары ключ-значение ассоциативного массива, мы объявить переменную управления для для цикла с атрибутом nameref:

declare -n identification 

так, чтобы петля

for identification in ${[email protected]}; do 

делает identification ведут себя, как если бы она была фактическая переменная с го e расширение ${[email protected]}.

По всей вероятности, это будет легче сделать что-то вроде следующего, хотя:

emails=('[email protected]' '[email protected]') 
passwords=('admin123' 'passwd1!') 
for ((i = 0; i < ${#emails[@]}; ++i)); do 
    echo "Email: ${emails[$i]}" 
    echo "Password: ${passwords[$i]}" 
done 

есть, просто цикл над двумя массивами, содержащими информацию.

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