変数を特定条件に従って展開する[[Bash]]の仕様。
> [!caution]
> `${parameter^pattern}` のような小文字・大文字変換は[[Bash]]4未満では未サポートのため除外している。[[macOS]]はライセンスの都合で[[Bash]]のバージョンが3系らしい。
## `${parameter:−word}`
`parameter` が未設定またはnullの場合
- `word`で指定された結果を返す
- `parameter` の値は上書きされない
```bash
x=123
y=
echo "${x:-default}" # 123
echo "${y:-default}" # default
echo "$x" # 123
echo "$y" #
```
## `${parameter:=word}`
`parameter` が未設定またはnullの場合
- `word`で指定された結果を返す
- **`parameter`の値は上書きされる**
```bash
x=123
y=
echo "${x:-default}" # 123
echo "${y:-default}" # default
echo "$x" # 123
echo "$y" # default
```
## `${parameter:?word}`
`parameter` が未設定またはnullの場合
- `word`のメッセージを[[標準エラー出力]]に出力する
- 0以外のステータスで処理を終了する
```bash
x=123
y=
echo "${x:?error message}" # 123
echo "${y:?error message}" # ./index.sh: line 7: y: error message
echo "$x"
echo "$y"
```
## `${parameter:+word}`
`parameter` が未設定またはnullの場合
- nullを返す
- `parameter` の値は上書きされない
```bash
x=123
y=
echo "${x:+default}" # default
echo "${y:+default}" #
echo "$x" # 123
echo "$y" #
```
## `${parameter:offset:length}`
`parameter` の 位置`offset` から `limit`文字 だけ返す。`length` が省略された場合は `parameter` の最後まで。
```bash
x=123456789
y=
echo "${x:2}" # 3456789
echo "$x" # 123456789
echo "${x:2:5}" # 34567
echo "$x" # 123456789
echo "${y:2:5}" #
```
## `${parameter#pattern}`
`parameter` から `pattern` の[[glob]]に**先頭から最短マッチ**した部分を**削除した残り**を返す。
```bash
x=ab.cd.ef.gh
echo "${x#*.}" # cd.ef.gh
echo $x # ab.cd.ef.gh
```
## `${parameter##pattern}`
`parameter` から `pattern` の[[glob]]に**先頭から最長マッチ**した部分を**削除した残り**を返す。
```bash
x=ab.cd.ef.gh
echo "${x##*.}" # gh
echo $x # ab.cd.ef.gh
```
## `${parameter%pattern}
`parameter` から `pattern` の[[glob]]に**末尾から最短マッチ**した部分を**削除した残り**を返す。
```bash
x=ab.cd.ef.gh
echo "${x%.*}" # ab.cd.ef
echo $x # ab.cd.ef.gh
```
## `${parameter%%pattern}
`parameter` から `pattern` の[[glob]]に**末尾から最長マッチ**した部分を**削除した残り**を返す。
```bash
x=ab.cd.ef.gh
echo "${x%%.*}" # ab
echo $x # ab.cd.ef.gh
```
## `${parameter/pattern/string}
`parameter` から `pattern` の[[glob]]に**最初に一致した文字列**が `string` で置換される。
```bash
x=ab.cd.ef.gh
echo "${x/./-}" # ab-cd.ef.gh
echo $x # ab.cd.ef.gh
```
## `${parameter//pattern/string}
`parameter` から `pattern` の[[glob]]に**一致したすべての文字列**が `string` で置換される。
```bash
x=ab.cd.ef.gh
echo "${x//./-}" # ab-cd-ef-gh
echo $x # ab.cd.ef.gh
```