반응형
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 링크가 있습니다.
반응형
'Program Tip' 카테고리의 다른 글
일치하는 행을 삭제하는 더 빠른 방법? (0) | 2020.12.11 |
---|---|
C #에서 F # List.map에 해당합니까? (0) | 2020.12.11 |
PowerShell에서 추가 된 유형을 다시 제거 할 수 있습니까? (0) | 2020.12.11 |
축 제목에 그리스 문자 추가 (0) | 2020.12.11 |
Google + 1 버튼에 맞춤 이미지를 사용 하시겠습니까? (0) | 2020.12.11 |