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.
Top comments (0)