3 külön tömböt kombinálva egy többdimenziós tömbhöz a bash

Lehetséges-e többdimenziós tömbök létrehozása a bash parancsfájlokban?

Ez az én 3 tömböm :

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

Most ezt a 3 tömböt csak egy tömbbe szeretném tenni – ez lehetséges? Ezután txt fájlban szeretném megmutatni őket. Most így csinálom:

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

Válasz

Feladó 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. 

Kulcsmondat:

A Bash egydimenziós indexelt és asszociatív tömbváltozókat biztosít.

Tehát nem, a bash nem támogatja a többdimenziós tömböket.

Válasz

Most futottam bele ebbe. Van egy meglehetősen egyszerű megoldás, ami nekem bevált. Olyan tömböt akartam használni, amely tartalmazott egy eszköz nevét és egy képernyő helyzetét, hogy megjelenítse az eszköz kulcstérképét. A következőket tettem: az eszköz nevét és a hozzá tartozó képernyő pozíciót egy karakterláncba összefűztem, elválasztó segítségével (esetemben a . ), amiről tudtam, hogy egyik értékemben sem fog megjelenni. Ezután a cut segítségével feloszlattam az összetett értékeket összetevőikre, ha szükséges. Lehet, hogy ennek tisztább és egyszerűbb módja van, de ez csak annak bemutatására szolgál, hogy létrehozhat egy többdimenziós tömböt, valamilyen módon, a bash-ban, bár ez nem támogatja:

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

Ez némileg hasonlít a Coop.Computer válaszához .

Válasz

Itt egy számomra megfelelő megoldás. Ha először így állítottuk be a tömböt:

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

A helyőrző ott van hogy ne kelljen 0 indexszel foglalkoznod.

Ezután minden " sor " minden, ami lehetséges osztva 3-mal, és minden " szlop " 1 vagy 2-rel kevesebb, mint a " " sor.

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

Az alábbiakban található egy mintaszkript:

  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  

Tehát minden index, amely felosztható 3-mal, " sort ", valamint a harmadik harmadik " oszlop " is. A második és az első " " oszlop megszerzéséhez vonjon le ennek megfelelően 1-et vagy 2-et.

Ez is felnövekedhet ha szükséges.

Frissítés: Az alábbiakban található egy kód, amelyet a fájlnevek karakterlánc-pótlásainak betöltésére és tömbjére használok. Az első tömb fájlból töltődik be, majd 2 külön tömbre oszlik.

  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  

Megjegyzések

  • Ez a ' megfelelő módja a 2D tömb hamisításának, ha az összes elem hossza ismert (és következetes), de természetesen nem változó hosszúságú elemeknél fog működni.
  • Számomra az az egyszerű módszer lenne, ha csak 3 tömböt használnánk, az index pedig a közös kapcsolat közöttük.

Válasz

Bármennyire is szeretem a Bash-t, van értelme néha más nyelvekre váltani. Ez meglehetősen egyszerű egy szótár használatával a Pythonban:

#!/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"])) 

Ennek futtatásával kapjuk meg a következőket:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük