Bash expansions
Handy table of Bash expansions.
Use cases:
- Default values:
${var:-default}(assignsdefaultifvaris unset or empty) - Alternate value if set:
${var:+alternate}(returnsalternateifvaris set and not empty) if (( ${array[*]+1} )); then- checking if array is not empty under old bash with set -uif (( ${array[*]+${#array[*]}}+0 > SOME_VALUE )); then- getting the number of array elements under old bash with set -u
null means set and empty, like var="".
Parameter is set to the string parameter parameter="parameter".
| What | Parameter | Result |
|---|---|---|
| ${parameter-word} | unset | word |
| ${parameter-word} | null | parameter |
| ${parameter-word} | set nonull | parameter |
| ${parameter:-word} | unset | word |
| ${parameter:-word} | null | word |
| ${parameter:-word} | set nonull | parameter |
| ${parameter+word} | unset | nothing |
| ${parameter+word} | null | word |
| ${parameter+word} | set nonull | word |
| ${parameter:+word} | unset | nothing |
| ${parameter:+word} | null | nothing |
| ${parameter:+word} | set nonull | word |
| ${parameter?word} | unset | echo word >&2;exit 1 |
| ${parameter?word} | null | parameter |
| ${parameter?word} | set nonull | parameter |
| ${parameter:?word} | unset | echo word >&2;exit 1 |
| ${parameter:?word} | null | echo word >&2;exit 1 |
| ${parameter:?word} | set nonull | parameter |
For arrays:
| What | array | $# | Result |
|---|---|---|---|
| "${array[@]-word}" | unset | 1 | word |
| "${array[@]-word}" | array=() | 1 | word |
| "${array[@]-word}" | array=('') | 1 | '' |
| "${array[@]-word}" | array=(val) | 1 | val |
| "${array[@]:-word}" | unset | 1 | word |
| "${array[@]:-word}" | array=() | 1 | word |
| "${array[@]:-word}" | array=('') | 1 | word |
| "${array[@]:-word}" | array=(val) | 1 | val |
| "${array[@]+word}" | unset | 0 | |
| "${array[@]+word}" | array=() | 0 | |
| "${array[@]+word}" | array=('') | 1 | word |
| "${array[@]+word}" | array=(val) | 1 | word |
| "${array[@]:+word}" | unset | 0 | |
| "${array[@]:+word}" | array=() | 0 | |
| "${array[@]:+word}" | array=('') | 0 | |
| "${array[@]:+word}" | array=(val) | 1 | word |
| "${array[@]?word}" | unset | -- | echo word >&2;exit 1 |
| "${array[@]?word}" | array=() | -- | echo word >&2;exit 1 |
| "${array[@]?word}" | array=('') | 1 | '' |
| "${array[@]?word}" | array=(val) | 1 | val |
| "${array[@]:?word}" | unset | -- | echo word >&2;exit 1 |
| "${array[@]:?word}" | array=() | -- | echo word >&2;exit 1 |
| "${array[@]:?word}" | array=('') | -- | echo word >&2;exit 1 |
| "${array[@]:?word}" | array=(val) | 1 | val |
| "${array[*]-word}" | unset | 1 | word |
| "${array[*]-word}" | array=() | 1 | word |
| "${array[*]-word}" | array=('') | 1 | '' |
| "${array[*]-word}" | array=(val) | 1 | val |
| "${array[*]:-word}" | unset | 1 | word |
| "${array[*]:-word}" | array=() | 1 | word |
| "${array[*]:-word}" | array=('') | 1 | word |
| "${array[*]:-word}" | array=(val) | 1 | val |
| "${array[*]+word}" | unset | 1 | '' |
| "${array[*]+word}" | array=() | 1 | '' |
| "${array[*]+word}" | array=('') | 1 | word |
| "${array[*]+word}" | array=(val) | 1 | word |
| "${array[*]:+word}" | unset | 1 | '' |
| "${array[*]:+word}" | array=() | 1 | '' |
| "${array[*]:+word}" | array=('') | 1 | '' |
| "${array[*]:+word}" | array=(val) | 1 | word |
| "${array[*]?word}" | unset | -- | echo word >&2;exit 1 |
| "${array[*]?word}" | array=() | -- | echo word >&2;exit 1 |
| "${array[*]?word}" | array=('') | 1 | '' |
| "${array[*]?word}" | array=(val) | 1 | val |
| "${array[*]:?word}" | unset | -- | echo word >&2;exit 1 |
| "${array[*]:?word}" | array=() | -- | echo word >&2;exit 1 |
| "${array[*]:?word}" | array=('') | -- | echo word >&2;exit 1 |
| "${array[*]:?word}" | array=(val) | 1 | val |
| "${array[@]-"word1" "word2"}" | unset | 1 | word1\ word2 |
| "${array[@]-"word1" "word2"}" | array=() | 1 | word1\ word2 |
| "${array[@]-"word1" "word2"}" | array=('') | 1 | '' |
| "${array[@]-"word1" "word2"}" | array=(val) | 1 | val |
| "${array[@]-"word1" "word2"}" | array=('' '') | 2 | '' '' |
| "${array[@]:-"word1" "word2"}" | unset | 1 | word1\ word2 |
| "${array[@]:-"word1" "word2"}" | array=() | 1 | word1\ word2 |
| "${array[@]:-"word1" "word2"}" | array=('') | 1 | word1\ word2 |
| "${array[@]:-"word1" "word2"}" | array=(val) | 1 | val |
| "${array[@]:-"word1" "word2"}" | array=('' '') | 2 | '' '' |
| "${array[@]+"word1" "word2"}" | unset | 0 | |
| "${array[@]+"word1" "word2"}" | array=() | 0 | |
| "${array[@]+"word1" "word2"}" | array=('') | 1 | word1\ word2 |
| "${array[@]+"word1" "word2"}" | array=(val) | 1 | word1\ word2 |
| "${array[@]+"word1" "word2"}" | array=('' '') | 1 | word1\ word2 |
| "${array[@]:+"word1" "word2"}" | unset | 0 | |
| "${array[@]:+"word1" "word2"}" | array=() | 0 | |
| "${array[@]:+"word1" "word2"}" | array=('') | 0 | |
| "${array[@]:+"word1" "word2"}" | array=(val) | 1 | word1\ word2 |
| "${array[@]:+"word1" "word2"}" | array=('' '') | 1 | word1\ word2 |
| "${array[@]?"word1" "word2"}" | unset | -- | echo word >&2;exit 1 |
| "${array[@]?"word1" "word2"}" | array=() | -- | echo word >&2;exit 1 |
| "${array[@]?"word1" "word2"}" | array=('') | 1 | '' |
| "${array[@]?"word1" "word2"}" | array=(val) | 1 | val |
| "${array[@]?"word1" "word2"}" | array=('' '') | 2 | '' '' |
| "${array[@]:?"word1" "word2"}" | unset | -- | echo word >&2;exit 1 |
| "${array[@]:?"word1" "word2"}" | array=() | -- | echo word >&2;exit 1 |
| "${array[@]:?"word1" "word2"}" | array=('') | -- | echo word >&2;exit 1 |
| "${array[@]:?"word1" "word2"}" | array=(val) | 1 | val |
| "${array[@]:?"word1" "word2"}" | array=('' '') | 2 | '' '' |
| ${array[@]-"word1" "word2"} | unset | 2 | word1 word2 |
| ${array[@]-"word1" "word2"} | array=() | 2 | word1 word2 |
| ${array[@]-"word1" "word2"} | array=('') | 0 | |
| ${array[@]-"word1" "word2"} | array=(val) | 1 | val |
| ${array[@]-"word1" "word2"} | array=('' '') | 0 | |
| ${array[@]:-"word1" "word2"} | unset | 2 | word1 word2 |
| ${array[@]:-"word1" "word2"} | array=() | 2 | word1 word2 |
| ${array[@]:-"word1" "word2"} | array=('') | 2 | word1 word2 |
| ${array[@]:-"word1" "word2"} | array=(val) | 1 | val |
| ${array[@]:-"word1" "word2"} | array=('' '') | 0 | |
| ${array[@]+"word1" "word2"} | unset | 0 | |
| ${array[@]+"word1" "word2"} | array=() | 0 | |
| ${array[@]+"word1" "word2"} | array=('') | 2 | word1 word2 |
| ${array[@]+"word1" "word2"} | array=(val) | 2 | word1 word2 |
| ${array[@]+"word1" "word2"} | array=('' '') | 2 | word1 word2 |
| ${array[@]:+"word1" "word2"} | unset | 0 | |
| ${array[@]:+"word1" "word2"} | array=() | 0 | |
| ${array[@]:+"word1" "word2"} | array=('') | 0 | |
| ${array[@]:+"word1" "word2"} | array=(val) | 2 | word1 word2 |
| ${array[@]:+"word1" "word2"} | array=('' '') | 2 | word1 word2 |
| ${array[@]?"word1" "word2"} | unset | -- | echo word >&2;exit 1 |
| ${array[@]?"word1" "word2"} | array=() | -- | echo word >&2;exit 1 |
| ${array[@]?"word1" "word2"} | array=('') | 0 | |
| ${array[@]?"word1" "word2"} | array=(val) | 1 | val |
| ${array[@]?"word1" "word2"} | array=('' '') | 0 | |
| ${array[@]:?"word1" "word2"} | unset | -- | echo word >&2;exit 1 |
| ${array[@]:?"word1" "word2"} | array=() | -- | echo word >&2;exit 1 |
| ${array[@]:?"word1" "word2"} | array=('') | -- | echo word >&2;exit 1 |
| ${array[@]:?"word1" "word2"} | array=(val) | 1 | val |
| ${array[@]:?"word1" "word2"} | array=('' '') | 0 | |
| ${array[*]-"word1" "word2"} | unset | 2 | word1 word2 |
| ${array[*]-"word1" "word2"} | array=() | 2 | word1 word2 |
| ${array[*]-"word1" "word2"} | array=('') | 0 | |
| ${array[*]-"word1" "word2"} | array=(val) | 1 | val |
| ${array[*]-"word1" "word2"} | array=('' '') | 0 | |
| ${array[*]:-"word1" "word2"} | unset | 2 | word1 word2 |
| ${array[*]:-"word1" "word2"} | array=() | 2 | word1 word2 |
| ${array[*]:-"word1" "word2"} | array=('') | 2 | word1 word2 |
| ${array[*]:-"word1" "word2"} | array=(val) | 1 | val |
| ${array[*]:-"word1" "word2"} | array=('' '') | 0 | |
| ${array[*]+"word1" "word2"} | unset | 0 | |
| ${array[*]+"word1" "word2"} | array=() | 0 | |
| ${array[*]+"word1" "word2"} | array=('') | 2 | word1 word2 |
| ${array[*]+"word1" "word2"} | array=(val) | 2 | word1 word2 |
| ${array[*]+"word1" "word2"} | array=('' '') | 2 | word1 word2 |
| ${array[*]:+"word1" "word2"} | unset | 0 | |
| ${array[*]:+"word1" "word2"} | array=() | 0 | |
| ${array[*]:+"word1" "word2"} | array=('') | 0 | |
| ${array[*]:+"word1" "word2"} | array=(val) | 2 | word1 word2 |
| ${array[*]:+"word1" "word2"} | array=('' '') | 2 | word1 word2 |
| ${array[*]?"word1" "word2"} | unset | -- | echo word >&2;exit 1 |
| ${array[*]?"word1" "word2"} | array=() | -- | echo word >&2;exit 1 |
| ${array[*]?"word1" "word2"} | array=('') | 0 | |
| ${array[*]?"word1" "word2"} | array=(val) | 1 | val |
| ${array[*]?"word1" "word2"} | array=('' '') | 0 | |
| ${array[*]:?"word1" "word2"} | unset | -- | echo word >&2;exit 1 |
| ${array[*]:?"word1" "word2"} | array=() | -- | echo word >&2;exit 1 |
| ${array[*]:?"word1" "word2"} | array=('') | -- | echo word >&2;exit 1 |
| ${array[*]:?"word1" "word2"} | array=(val) | 1 | val |
| ${array[*]:?"word1" "word2"} | array=('' '') | 0 |