This is hands down the best Bash resource online or in print. Don't let the "advanced" throw you off. It's the source of pretty much everything (of significance) that I know about bash.
For other applications it makes sense to use your scripting language of choice (libraries, etc.) but in any situation where you need absolute portability or availability on an otherwise bare system, bash is the way to go.
There are whole projects like the Arch Linux Installation Framework (AIF) written in bash for this reason.
Named arrays, quick string handling and the [[ ]] test syntax alone make this worth reading, and that's just scratching the surface.
Unfortunately a lot of the stuff has not been updated in 5 yrs or so - but it is still fun to read through from time to time.
It is not exactly a BASH guide but another good guide is "UNIX for Poets" - I think there have been a number of news.ycombinator posts regarding it. This is a good intro for the text manipulation tools you would tend to use in a BASH script.
How is that portable, across different architectures?
I have to work in Solaris, SUSE SLES, some other linux where I don't know what they run, and OS X and I don't have root on most of those. bash seems to work the same everywhere and always seems to be there when I get access to a newly provisioned environment.
Not every Unix-like OS comes with bash, and certainly not by default. In particular, Solaris ships with a particularly crippled /bin/sh, although they do have a proper POSIX-compatible Bourne shell at /usr/xpg4/bin/sh.
If your Solaris machines have /bin/bash available, consider yourself very lucky.
dash is portable in the sense that Debian needs it to be: they can port it to the architectures and systems that they need it to work on.
dash is also portable in the sense that you need it to be: it implements the POSIX shell spec and not much more, so it's likely that you have access to all its features when you need to use another shell as well.
For other applications it makes sense to use your scripting language of choice (libraries, etc.) but in any situation where you need absolute portability or availability on an otherwise bare system, bash is the way to go.
There are whole projects like the Arch Linux Installation Framework (AIF) written in bash for this reason.
Named arrays, quick string handling and the [[ ]] test syntax alone make this worth reading, and that's just scratching the surface.