Program Tip

Bash의 변경 가능한 목록 또는 배열 구조?

programtip 2020. 12. 11. 19:20
반응형

Bash의 변경 가능한 목록 또는 배열 구조? 어떻게 쉽게 추가 할 수 있습니까?


bash 스크립트에서 문자열 값을 수집하려고합니다. 문자열 값을 목록 또는 배열 구조에 추가하여 끝에 에코 할 수있는 가장 간단한 방법은 무엇입니까?


$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4

Bash는 희소 배열을 사용하므로 요소 수 ${#arr}를 인덱스로 사용해서는 안됩니다 . 그러나 다음과 같은 인덱스 배열을 얻을 수 있습니다.

$ indices=(${!arr[@]})

foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done

Ignacio가 다른 답변에서 제안한 내용을 추가하려면 다음을 수행하십시오.

foo=(a b c)
foo=("${foo[@]}" d) # push element 'd'

foo[${#foo[*]}]="e" # push element 'e'

for i in "${foo[@]}"; do echo "$i" ; done

bash에서 배열 끝에 추가하는 다소 모호한 구문은 다음과 같습니다.

myarr[${#myarr[*]}]=”$newitem”

$ for i in "string1" "string2" "string3"
> do
> array+=($i)
> done
$ echo ${array[@]}
string1 string2 string3

질문에 대한 답변이 있고 꽤 오래 되었지만 ennukiller 의 답변을 제외하고는 다른 방법보다 훨씬 빠르게 작동하므로 네임 스페이스 솔루션을 공유하고 싶습니다 (내 100k 줄 테스트에서 ~ 14에 대해 ~ 12 초를 얻었습니다. 하지만 list-append 솔루션은 몇 분 정도 걸립니다.)

다음 트릭을 사용할 수 있습니다.

# WORKS FASTER THAN THESE LAME LISTS! ! !
size=0;while IFS= read -r line; do
    echo $line
    ((++size))
    eval "SWAMP_$size='$line'"
done

또는 다음을 수행 할 수 있습니다.

#!/bin/bash
size=0
namespace="SWAMP"

ArrayAppend() {
    namespace="$1"
    # suppose array size is global
    new_value="$2"
    eval "${namespace}_$size='$2'"
    eval "echo \$${namespace}_$size"
    ((++size))
}

ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"

인터프리터가 태그 목록에있는 한 여기에 객체 지향 bash 링크가 있습니다.

참고 URL : https://stackoverflow.com/questions/2013396/mutable-list-or-array-structure-in-bash-how-can-i-easily-append-to-it

반응형