You know the basics: ${var:-default} gives you a fallback. ${var:=default} assigns it. Fine. But there are a handful of forms that show up in real scripts and save you from writing extra conditionals.
The Ones Worth Remembering
${var@Q} — shell-quote the value
This is the one I reach for when passing arguments through SSH or building command strings that need to survive parsing.
cmd="docker run --rm alpine echo ${msg@Q}" ssh host "$cmd" Without @Q, a message like hello world becomes two arguments. With it, you get 'hello world' — single argument, preserved.
${arr[@]@Q} — quote every array element
Same idea, but for arrays. Invaluable when you're forwarding a command with its arguments:
run_remote() { local cmd=("$@") ssh host "${cmd[@]@Q}" } run_remote docker run --rm alpine echo "hello world" Each element gets quoted individually. The remote shell sees exactly what you passed.
${var@P} — prompt expansion
Expands prompt escape sequences. Useful if you're generating PS1-style strings programmatically:
prompt="\u@\h:\w\$ " echo "${prompt@P}" # saiki@server:/home/saiki$ Not something you need daily, but handy when you're building a dynamic prompt or logging with context.
The Glob Replacement Form
${var//pattern/repl} — global replace (there is also ${var/pattern/repl} for first match only)
path="/usr/local/bin:/usr/bin:/bin" echo "${path//:/ }" # /usr/local/bin /usr/bin /bin Cleaner than tr or sed for simple delimiters. Works with extended globs too if you shopt -s extglob.
The Error Form
${var:?error message} — fail with message if unset or empty
: "${DEPLOY_TARGET:?DEPLOY_TARGET not set}" Fails fast with your message. Better than a cryptic "unbound variable" later.
Why This Matters
These aren't clever tricks. They're standard Bash (since 4.4 for @Q/@P, earlier for the rest). Using them means fewer if blocks, fewer printf '%q' calls, fewer bugs from word-splitting surprises.
Next time you reach for a conditional to handle a default or quote a string, check if there's a parameter expansion form that does it inline. Often there is.



