Bookmarking directories
Some suggestions:


#!/usr/bin/env bash is a very common shebang line these days.
Use More Quotes™:


echo -e $i'\t'"${BOOKMARKS[$i]}" should be echo -e $i'\t'"${BOOKMARKS[$i]}" (or even better, printf '%s\t%s' "$i" "${BOOKMARKS[$i]}")
command=$1 should be command="$1"

In [[ "$command" =~ [0-9]+ ]] you'll want to anchor the regex.
If this is for your own use I don't quite understand the need for both option-style and command-style invocation.
== in Bash is a bit of a historical accident. It won't make any difference as long as you use Bash, but I usually prefer the POSIX = in this case.
It seems bm_compact should run on every change, since it'll be super fast and you avoid changing indexes.
bmfile would be better as either configuration or as a single variable.
"default !/.bookmarks" should probably be "default ~/.bookmarks".
You can set IFS for a single command, such as while IFS=… read …
All the single semicolons are extraneous - you definitely don't need one for echo -e $i'\t'"${BOOKMARKS[$i]}" ;, and you can use

for i in "${!BOOKMARKS[@]}"
do


for loops and conditionals.