Bash에서 간접 배열의 크기를 얻는 방법은 무엇입니까?

Bash에서 간접 배열의 크기를 얻는 방법은 무엇입니까?

평가를 사용하지 마십시오.

이것은 작동하지 않습니다:

astr=(a b c)    
str="#astr[@]"
echo "${!str}"

답변1

팁에서여기, 나는 이것을 할 수 있었습니다:

astr=(a b c)
declare -n astrRef="astr"
echo ${#astrRef[@]}

또한 이러한 배열을 생성하거나 단순히 간접 할당을 통해 생성할 수도 있습니다.

declare -n astrRef="astr"
astrRef=(d e f)
declare -p astrRef astr
astrRef+=(g)
declare -p astrRef astr

답변2

이것은 어떻습니까? 적어도 효과가 있습니다.배쉬 3.x위에:

astr=(a b c)
str=astr[@]              # Our reference to an array
local arr=("${!str}")    # Copy into an array using indirect ref
echo ${#arr[*]}
# 3

bstr=("a foo" "a bar" "a fox" "a buzz")
str=bstr[@]
local arr=("${!str}")
echo ${#arr[*]}
# 4

함수에 로컬로 local작업 변수를 유지하기 위해 키워드를 사용 하지만 이는 선택 사항입니다. arr실제로 bash 제한으로 인해 arr배열의 요소에 (간접적으로) 액세스하는 데 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

echo ${arr[1]}       # Print 2nd element
echo ${#arr[1]}      # ... print its size

(테스트됨배쉬 3.1.23, 배쉬 4.3.48 및 4.4.12)

관련 정보