Why does my function behave differently with associative and normal arrays?

0
2
Asked By CuriousCoder23 On

I have a Bash function that I'm using to delete AWS SSM parameters, but I'm running into a weird issue. When I pass a normal array to the function, it recognizes all three values correctly. However, when I send an associative array, it only recognizes two values. Here's my function:

```bash
#!/usr/bin/env bash

function run_aws_ssm_delete_parameters() {
local -r enable_logging="$1"
local -n parameter_names="$2"
shift 2

local -a aws_cli_flags=(
"delete-parameters"
"--names"
"${parameter_names[@]}"
)

aws_cli_flags+=("$@")

set -x
if result="$(aws ssm "${aws_cli_flags[@]}")"; then
set +x
[[ "${enable_logging}" = true ]] && printf "Good: %sn" "${result}"
return 0
else
set +x
printf "Bad: %s" "$?"
return 1
fi
}

function main() {
local -a normal_array=("one" "two" "three")
run_aws_ssm_delete_parameters true normal_array --color on

local -A associative_array=(
["one"]="value_one"
["two"]="value_two"
["three"]="value_three"
)

run_aws_ssm_delete_parameters true "${!associative_array[@]}" --color on
}

main "$@"
```

When I run this with my normal array, it gives the expected output:
```
++ aws ssm delete-parameters --names one two three --color on

Unable to locate credentials. You can configure credentials by running "aws configure".
+ result=
+ set +x
Bad: 0
```

But when I switch to the associative array, it only returns two values:
```
++ aws ssm delete-parameters --names value_two value_three --color on

Unable to locate credentials. You can configure credentials by running "aws configure".
+ result=
+ set +x
Bad: 0
```

I tried modifying the main function by sending the associative array as a whole instead of expanding it, but I ended up with similar results. How can I ensure I send all the keys from the associative array when calling my function?

3 Answers

Answered By ShellHackers88 On

The issue you described can sometimes happen if you're running your script in a different shell environment. Make sure you’re consistency testing it either in Bash or Zsh, as the behaviors can differ slightly. Also, keep an eye on any variable manipulations that might inadvertently alter the expected outputs.

Answered By TechieTim007 On

I can't reproduce what you’re seeing. When I use `"${!associative_array[@]}"`, I'm able to get all three keys without issue. It might be worth checking the versions of Bash or Zsh you’re using since different environments could potentially affect how arrays behave. Also, consider if there's something specific to your setup that's causing this unusual behavior.

Answered By ScriptingSavant99 On

It sounds like your issue might be related to how you're handling the parameters in your function. When you pass the associative array using `"${!associative_array[@]}"`, that should give you all three keys, but the `shift` command in your function might be causing one of those keys to be discarded. Since you're shifting after reading the parameters, it might leave you with fewer than expected. Try adjusting that part to ensure all keys are retained!

Related Questions

LEAVE A REPLY

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.