kombinere 3 separate arrays til et multidimensionelt array i bash

Er det muligt at oprette multidimensionelle arrays i bash scripting?

Dette er mine 3 arrays :

arrayCITY=( NewYork LasVegas Detroit ) arraySTREET=( RoadStreet TreeStreet HighStreet ) arrayNUMBER=( 20 455 300 ) 

Nu vil jeg placere disse 3 arrays i bare et array – er dette muligt? Så vil jeg vise dem i en txt-fil. Nu gør jeg det sådan:

for ((i=0; i<${#arrayCITY[*]}; i++));do echo "${arrayCITY[i]} ${arraySTREET[i]} ${arrayNUMBER[i]}" >> TEXT.txt done 

Svar

Fra 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. 

Nøglefrase:

Bash giver endimensionelle indekserede og associerende matrixvariabler.

Så nej, bash understøtter ikke multidimensionelle arrays.

Svar

Jeg løb ind i dette lige nu. Der er en ret simpel løsning, der fungerede for mig. Jeg ville bruge et array, der indeholdt et enhedsnavn og en skærmposition til at vise et nøglekort til enheden. Jeg gjorde følgende: Jeg sammenkædede enhedsnavnet og den tilknyttede skærmposition i en enkelt streng ved hjælp af en afgrænser (i mit tilfælde brugte jeg . ) som jeg vidste ikke ville vises i nogen af mine værdier. Derefter brugte jeg cut til at opdele de sammensatte værdier i deres komponenter, når det var nødvendigt. Der kan være en renere og enklere måde at gøre dette på, men dette er bare for at vise, at du kan oprette et flerdimensionelt array på en måde i bash, selvom det ikke understøtter det:

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

Dette svarer til Coop.Computers svar .

Svar

Her “er en løsning, der fungerer for mig. Hvis vi først konfigurerer arrayet sådan:

  arrayCSR=( Placeholder_for_0_spot NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 )  

Pladsholderen er der for at undgå at skulle håndtere et 0-indeks.

Derefter er hver " række " alt, hvad der kan være divideret med 3, og hver " kolonne " er 1 eller 2 mindre end " række " nummer.

${arrayCSR[${3}]} is 20 ${arrayCSR[${2}]} is RoadStreet ${arrayCSR[${1}]} is NewYork 

Et eksempelscript er nedenfor:

  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  

Så ethvert indeks, der kan dele med 3, indikerer en " række ", og også den tredje " kolonne " i rækken. For at få den anden og første " kolonne " trækkes 1 eller 2 i overensstemmelse hermed.

Dette kan også skaleres op om nødvendigt.

Opdatering: Nedenfor er en kode, som jeg bruger til at indlæse og oprette strengudskiftninger til filnavne. Den første matrix indlæses fra en fil og opdeles derefter i 2 separate arrays.

  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  

Kommentarer

  • At ' er en pæn måde at falske et 2D-array, hvis længden af alle elementer er kendt (og konsistent), men vil naturligvis ikke fungere for elementer med variabel længde.
  • For mig er den enkle måde at bare bruge 3 arrays, hvor indekset er den fælles forbindelse mellem dem.

Svar

Så meget som jeg kan lide Bash, er det fornuftigt at nogle gange skifte til andre sprog. Dette er ret ligetil ved hjælp af en ordbog i 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"])) 

At køre dette giver:

./cities.py New York: Roadstreet 20 Las Vegas: TreeStreet 455 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *