diff --git a/crates/bashkit/src/interpreter/mod.rs b/crates/bashkit/src/interpreter/mod.rs index 937a3cf1..bc144e16 100644 --- a/crates/bashkit/src/interpreter/mod.rs +++ b/crates/bashkit/src/interpreter/mod.rs @@ -4354,6 +4354,11 @@ impl Interpreter { .unwrap() .locals .insert(arg.to_string(), String::new()); + if flags.assoc { + self.assoc_arrays.entry(arg.to_string()).or_default(); + } else if flags.array { + self.arrays.entry(arg.to_string()).or_default(); + } if flags.integer { self.variables .insert(format!("_INTEGER_{}", arg), "1".to_string()); @@ -4438,7 +4443,13 @@ impl Interpreter { .insert(var_name.to_string(), value.to_string()); } } else if !is_internal_variable(arg) { - self.insert_variable_checked(arg.to_string(), String::new()); + if flags.assoc { + self.assoc_arrays.entry(arg.to_string()).or_default(); + } else if flags.array { + self.arrays.entry(arg.to_string()).or_default(); + } else { + self.insert_variable_checked(arg.to_string(), String::new()); + } } } } diff --git a/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh b/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh index fc0829a9..1ed9c7bb 100644 --- a/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh +++ b/crates/bashkit/tests/spec_cases/bash/assoc-arrays.test.sh @@ -173,6 +173,35 @@ b=2 c=3 ### end +### assoc_local_declare_then_assign +myfunc() { + local -A m + m["a"]="1" + m["b"]="2" + echo "count: ${#m[@]}" + for k in "${!m[@]}"; do echo "key=$k"; done | sort +} +myfunc +### expect +count: 2 +key=a +key=b +### end + +### assoc_local_keys_in_cmdsub +myfunc() { + local -A m + m["a"]="1" + m["b"]="2" + result="$(printf '%s\n' "${!m[@]}" | sort)" + echo "result: [$result]" +} +myfunc +### expect +result: [a +b] +### end + ### assoc_iteration declare -A m m[a]="1"