Today I learned that bash has hashmaps (2024)

Feature: Bash associative arrays (“hashmaps”)

  • Bash has associative arrays via declare -A, enabling key–value lookups.
  • Some find the syntax ugly or non-intuitive; others note it’s no worse than many mainstream languages.
  • Keys can be listed with ${!map[@]}; behavior differs between bash and zsh, so scripts should pin the shebang to bash if using this.

Portability and macOS limitations

  • macOS ships an ancient Bash 3.2 (due to GPL licensing), which lacks associative arrays; newer Bash from Homebrew supports them.
  • This hurts portability across Linux/macos if you rely on associative arrays. Some prefer zsh (included on macOS) or stick to POSIX sh.

Pitfalls, scope, and reliability

  • Associative arrays interact badly with Bash scoping and references:
    • local variables have dynamic scope (visible to child functions), which surprises many.
    • Passing associative arrays “by value” doesn’t work; “by reference” requires local -n and is fragile.
  • There are reports of historical memory leaks with associative arrays in long-running scripts on older distros.
  • Some argue that needing associative arrays is a sign the script is too complex and should move to Python, Go, etc.

Performance and implementation debate

  • One comment claims lookups are linear-time and “slow AF”, implying they are not real hashmaps.
  • Others argue “hashmap” is being used loosely: associative array is the abstraction; hash map is one possible implementation.
  • There’s disagreement over whether it’s appropriate to call Bash’s structure a hashmap at all.

Shell vs. other languages and tools

  • Several people like Bash for small glue scripts, pipelines, and text processing; they recommend other languages for heavy logic, data structures, and error handling.
  • Others report writing very large, long-lived Bash systems successfully, emphasizing its ubiquity and speed.

Documentation, learning, and shell evolution

  • Reading the Bash manual or release notes regularly surfaces features like arrays and obscure options.
  • Some find the 80+ page man page daunting, preferring example-driven “cheat sheets”.
  • Discussion touches on alternative shells (fish, nushell, PowerShell) and on whether Unix tools should output structured data (e.g., JSON) versus plain text.