評価を使用しないでください。
これはうまくいきません:
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)