bash 스크립팅에서 다차원 배열을 생성 할 수 있습니까?
이것들이 제 3 개의 배열입니다. :
arrayCITY=( NewYork LasVegas Detroit ) arraySTREET=( RoadStreet TreeStreet HighStreet ) arrayNUMBER=( 20 455 300 )
이제이 3 개의 배열을 하나의 배열에 넣고 싶습니다. 가능합니까? 그런 다음 txt 파일로 표시하고 싶습니다. 이제 다음과 같이합니다.
for ((i=0; i<${#arrayCITY[*]}; i++));do echo "${arrayCITY[i]} ${arraySTREET[i]} ${arrayNUMBER[i]}" >> TEXT.txt done
Answer
From 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.
키 구문 :
Bash는 1 차원 색인 및 연관 배열 변수를 제공합니다.
따라서 bash는 다차원 배열을 지원하지 않습니다.
답변
방금이 문제를 만났습니다. 나를 위해 일한 상당히 간단한 솔루션이 있습니다. 장치 이름과 화면 위치가 포함 된 배열을 사용하여 장치의 키 맵을 표시하고 싶었습니다. 다음을 수행했습니다. 구분 기호를 사용하여 장치 이름과 관련 화면 위치를 단일 문자열로 연결했습니다 (제 경우에는 .
) 내 가치에 나타나지 않을 것입니다. 그런 다음 cut
를 사용하여 필요한 경우 복합 값을 구성 요소로 분리했습니다. 이 작업을 수행하는 더 깨끗하고 간단한 방법이있을 수 있지만 이는 지원하지 않더라도 bash에서 어떤 방식으로 다차원 배열을 만들 수 있음을 보여주기위한 것입니다.
#!/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
이것은 Coop.Computer의 답변 과 다소 유사합니다.
Answer
여기에 저에게 적합한 솔루션이 있습니다. 먼저 다음과 같이 배열을 설정하면 :
arrayCSR=( Placeholder_for_0_spot NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 )
자리 표시자가 있습니다. 0 인덱스를 처리 할 필요가 없습니다.
그런 다음 각 " 행 "은 3으로 나누고 각 " 열 "은 "보다 1 또는 2 적습니다. row " 번호.
${arrayCSR[${3}]} is 20 ${arrayCSR[${2}]} is RoadStreet ${arrayCSR[${1}]} is NewYork
샘플 스크립트는 다음과 같습니다.
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
따라서 3으로 나눌 수있는 모든 인덱스는 " 행을 나타냅니다. div id = “8ea86a64bb”>
및 행의 세 번째 " 열 ". 두 번째 및 첫 번째 " 열 "을 얻으려면 그에 따라 1 또는 2를 뺍니다.
이렇게 확장 할 수도 있습니다. 필요한 경우.
업데이트 : 다음은 파일 이름에 대한 문자열 대체를로드하고 배열하는 데 사용하는 코드입니다. 첫 번째 배열은 파일에서로드 된 다음 2 개의 개별 배열로 분할됩니다.
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
댓글
- 그 ' 모든 요소의 길이를 알고있는 경우 2D 배열을 가짜로 만드는 깔끔한 방법입니다. 그러나 물론 가변 길이 요소에서는 작동하지 않습니다.
- 저에게 간단한 방법은 3 개의 배열을 사용하는 것입니다. 인덱스는 이들 사이의 공통 링크입니다.
답변
Bash를 좋아하는만큼 가끔 다른 언어로 전환하는 것이 좋습니다. 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"]))
이를 실행하면 다음과 같은 결과가 나타납니다.
./cities.py New York: Roadstreet 20 Las Vegas: TreeStreet 455