2016-03-30 1 views
0

J'apprends actuellement le script shell et j'ai besoin de votre aide!Comment faire une itération sur une liste de dictionnaires dans bash

> array = [{u'name': u'androidTest', u'arn': u'arn:XXX', u'created': 
1459270137.749}, {u'name': u'android-provider2016-03-3015:23:30', u'arn':XXXXX', u'created': 1459365812.466}] 

J'ai une liste de dictionnaire et que vous souhaitez extraire la valeur arn du dictionnaire. En python il est assez simple, par exemple:

for project in array: 
    print project['arn'] 

Comment vais-je écrire la boucle équivalent en bash? Si je tente quelque chose comme ça, il ne fonctionne pas:

for i in "$array" 
do 
    echo $i['arn'] 
done 

Le duplicata est suggéré pour les tableaux associatifs, pas une liste de tableaux associatifs.

+0

double possible de [Comment itérer sur un tableau associatif en bash] (http: // stackoverflow .com/questions/3112687/comment-itérer-sur-associative-array-in-bash) –

+0

J'ai fatigué cette réponse avant mais cela ne fonctionne pas. – python

+0

Avez-vous essayé la bonne chose? Le "comme ça" dans votre question n'est pas comment la réponse liée le fait. –

Répondre

3

Bash ne peut pas les structures de données de nid, de sorte que la chose qui correspondrait à la liste des dictionnaires n'existe pas nativement. L'utilisation d'un récent Bash (4.3), nous pouvons réaliser quelque chose de similaire avec namerefs:

# Declare two associative arrays 
declare -A arr1=([name]='androidTest' [arn]='arn:XXX' [created]='1459270137.749') 
declare -A arr2=([name]='android-provider2016-03-3015:23:30' 
       [arn]='XXXXX' [created]='1459365812.466') 

# Declare array of names of associative arrays 
arr_of_arrs=(arr1 arr2) 

# Loop over names 
for arr_name in "${arr_of_arrs[@]}"; do 

    # Assign name to nameref 
    declare -n arr_ref="$arr_name" 

    # Print value of key 'arn' 
    printf "%s\n" "${arr_ref[arn]}" 

done 

Ce retour

arn:XXX 
XXXXX 
+0

J'ai essayé beaucoup de méthodes différentes mais c'est logique maintenant. Bash considère qu'il s'agit d'une «chaîne» et non d'une «liste de dictionnaire». – python

+0

Pourquoi avez-vous défini deux 'arr'? – python

+0

@python Pour émuler votre liste de deux dictionnaires. Cela dépend vraiment de ce à quoi ressemble votre 'array 'actuel et de la façon dont les données sont arrivées. –

-3
for project in $array 
do 
    echo $project{'arn'} 
done 

Ou en une ligne:

for project in $array; do echo $project{'arn'}; done 
+0

Avez-vous testé cela? Il y a beaucoup de problèmes avec cette réponse: l'accès à un élément n'est pas $ arrayname {'key'} ', $ array s'étend seulement au premier élément ... –