Associative arrays: error "declare: -A: invalid option"
The following seems to be a typical scenario on macOS after installing a newer Bash with Homebrew:
/bin/bash
is the old Bash, 3.2/usr/local/bin/bash
is the new Bash that knows about associative arrays (4.0 or newer)type bash
points to/usr/local/bin/bash
andbash --version
is the new one (because it resolves to/usr/local/bin/bash --version
)
However, scripts with a #!/bin/bash
shebang line that are run with ./script
will use the old Bash (the scenario in the question). Solutions are:
- Call the script with
bash script
: the new Bash will be used. Disadvantage: you always have to call it like that. - Change the shebang line to
#!/usr/local/bin/bash
. Disadvantage: on many systems, there is no Bash in/usr/local/bin
and your script isn't portable any longer. - Change the shebang line to
#!/usr/bin/env bash
. This will use the firstbash
in yourPATH
, which should be the new one. This is pretty portable; the only downside is that you don't know exactly which Bash will be executed.
See also these Q&A:
- What is the difference between "#!/usr/bin/env bash" and "#!/usr/bin/bash"?
- Why is #!/usr/bin/env bash superior to #!/bin/bash?
- Why is it better to use “#!/usr/bin/env NAME” instead of “#!/path/to/NAME” as my shebang? on Unix & Linux
Make sure the version of bash being invoked as interpreter at the top of your shell script (#!/bin/bash
or whatever) is also version 4. If you're doing:
bash --version
and it's giving you v4, do a which bash
to check it's location.