Est-il possible de créer des tableaux multidimensionnels en script bash?
Voici mes 3 tableaux :
arrayCITY=( NewYork LasVegas Detroit ) arraySTREET=( RoadStreet TreeStreet HighStreet ) arrayNUMBER=( 20 455 300 )
Maintenant, je veux mettre ces 3 tableaux dans un seul tableau – est-ce possible? Ensuite, je veux les montrer dans un fichier txt. Maintenant, je le fais comme ceci:
for ((i=0; i<${#arrayCITY[*]}; i++));do echo "${arrayCITY[i]} ${arraySTREET[i]} ${arrayNUMBER[i]}" >> TEXT.txt done
Réponse
De man 1 bash
:
Arrays Bash provides one-dimensional indexed and associative array variables. Any variable may be used as an indexed array; the declare builtin will explicitly declare an array. There is no maximum limit on the size of an array, nor any requirement that members be indexed or assigned contiguously. Indexed arrays are referenced using integers (including arithmetic expressions) and are zero-based; associative arrays are referenced using arbitrary strings. Unless otherwise noted, indexed array indices must be non-negative integers.
Expression clé:
Bash fournit des variables de tableau indexées et associatives unidimensionnelles.
Donc, non, bash ne prend pas en charge les tableaux multidimensionnels.
Réponse
Je suis tombé dessus tout à lheure. Il existe une solution assez simple qui a fonctionné pour moi. Je voulais utiliser un tableau contenant un nom de périphérique et une position à lécran pour afficher une carte des touches de lappareil. Jai fait ce qui suit: Jai concaténé le nom de lappareil et la position décran associée en une seule chaîne, en utilisant un délimiteur (dans mon cas, jai utilisé .
) que je savais ne figurerait dans aucune de mes valeurs. Ensuite, jai utilisé cut
pour séparer les valeurs composites en leurs composants si nécessaire. Il existe peut-être un moyen plus propre et plus simple de le faire, mais cest juste pour montrer que vous pouvez créer un tableau multidimensionnel, dune certaine manière, dans bash, même sil ne le prend pas en charge:
#!/bin/bash # List of devices and screen positions for key maps. DEV_LIST=( g13.+2560+30 g510s.+3160+30 g502.+2560+555 ) # This just echoes the device name and the screen position. for DEV in "${DEV_LIST[@]}"; do DEVICE=$(echo $DEV | cut -f1 -d.) SCREEN_POSITION=$(echo $DEV | cut -f2 -d.) echo "$DEVICE" echo "$SCREEN_POSITION" done exit
Ceci est un peu similaire à la réponse de Coop.Computer .
Réponse
Voici « une solution qui fonctionne pour moi. Si nous configurons dabord le tableau comme ceci:
arrayCSR=( Placeholder_for_0_spot NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 )
Lespace réservé est là pour éviter davoir à traiter un index 0.
Ensuite, chaque " ligne " est tout ce qui peut être divisé par 3, et chaque " colonne " est 1 ou 2 de moins que le " row " nombre.
${arrayCSR[${3}]} is 20 ${arrayCSR[${2}]} is RoadStreet ${arrayCSR[${1}]} is NewYork
Un exemple de script est ci-dessous:
arrayCSR=( CsR NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 ) for p in $( seq 1 ${#arrayCSR[*]} ) do if [[ "${arrayCSR[${p}]}" == "" ]] # Don"t run if empty then true elif [[ $((p % 3 )) -eq 0 ]] # We have 3 "columns" in the array then echo " ${arrayCSR[$(( p - 2 ))]} ${arrayCSR[$(( p - 1))]} ${arrayCSR[${p}]}" fi done
Ainsi, tout index qui peut se diviser par 3 indique une " ligne ", ainsi que la troisième " colonne " de la ligne. Pour obtenir la deuxième et la première " colonne ", soustrayez 1 ou 2 en conséquence.
Cela peut également augmenter si nécessaire.
Mise à jour: Voici le code que jutilise pour charger et un tableau de remplacements de chaînes pour les noms de fichiers. Le premier tableau est chargé à partir dun fichier, puis est divisé en 2 tableaux distincts.
readarray -t string_replace < ~/scripts/string_replace.lst # List of things to remove from name for p in $( seq 0 ${#string_replace[*]} ); do old_name_element[${p}]="${string_replace[${p}]%%,*}" new_name_element[${p}]="${string_replace[${p}]:$((${#old_name_element[${p}]}+1))}" done string_replace=() # Clear old array
Commentaires
- Que ' est une manière intéressante de simuler un tableau 2D si la longueur de tous les éléments est connue (et cohérent), mais ne fonctionnera bien sûr pas pour les éléments de longueur variable.
- Pour moi, le moyen le plus simple serait dutiliser simplement 3 tableaux, lindex étant le lien commun entre eux.
Réponse
Autant jaime Bash, il est logique de parfois passer à dautres langues. Cest assez simple en utilisant un dictionnaire en Python:
#!/usr/bin/env python3 cities = { "New York": { "Street": "Roadstreet", "Number": 20 }, "Las Vegas": { "Street": "TreeStreet", "Number": 455 } } for city in cities: print(str(city) + ": " + str(cities[city]["Street"]) + " " + str(cities[city]["Number"]))
Lexécution de ceci donne:
./cities.py New York: Roadstreet 20 Las Vegas: TreeStreet 455