diff --git a/crates/bashkit/src/interpreter/mod.rs b/crates/bashkit/src/interpreter/mod.rs index 915b1d26..2a2d5823 100644 --- a/crates/bashkit/src/interpreter/mod.rs +++ b/crates/bashkit/src/interpreter/mod.rs @@ -5897,11 +5897,12 @@ impl Interpreter { result.push_str(&self.expand_array_access_part(name, index)); } WordPart::ArrayIndices(name) => { - if let Some(arr) = self.assoc_arrays.get(name) { + let resolved = self.resolve_nameref(name); + if let Some(arr) = self.assoc_arrays.get(resolved) { let mut keys: Vec<_> = arr.keys().cloned().collect(); keys.sort(); result.push_str(&keys.join(" ")); - } else if let Some(arr) = self.arrays.get(name) { + } else if let Some(arr) = self.arrays.get(resolved) { let mut indices: Vec<_> = arr.keys().collect(); indices.sort(); let index_strs: Vec = diff --git a/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh b/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh index 7d625b5a..a226f2b8 100644 --- a/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh +++ b/crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh @@ -82,6 +82,22 @@ count_entries data 3 ### end +### nameref_assoc_key_enumeration_string +# Nameref key enumeration via ${!ref[@]} in string context +show() { + local -n ref="$1" + for k in "${!ref[@]}"; do + echo "${k}=${ref[$k]}" + done | sort +} +declare -A m=([a]=1 [b]=2 [c]=3) +show m +### expect +a=1 +b=2 +c=3 +### end + ### nameref_overwrite_assoc_key # Nameref overwrite existing key in associative array update() {