メモ置き場

Bashパラメータ展開のメモ

${parameter:-word} デフォルト値の利用

# 値があるときはそのまま展開
$ var="abc"
$ echo "${var:-123}"
abc

# 空文字・未設定のとき、word部分が展開される。
$ unset var
$ echo "${var:-123}"
123

${parameter:=word} デフォルト値の代入

# 値があるときはそのまま展開
$ var="abc"
$ echo "${var:=123}"
abc

# 空文字・未設定のとき、parameterにwordが代入され、wordが展開される。
$ unset var
$ echo "${var:=123}"
123
$ echo "${var}"
123

${parameter:?word} 空文字列・未設定の場合エラー

# 値があるときはそのまま展開
$ var="abc"
$ echo "${var:?123}"
abc

# 空文字・未設定のときエラーとなり、エラーメッセージとしてwordを標準エラー出力に出力する。
$ unset var
$ echo "${var:?123}"
bash: var: 123
$ var=""
$ echo "${var:?123}"
bash: var: 123

${parameter:+word} 代替値の利用

# 値があるときwordが展開される。
$ var="abc"
$ echo "${var:+123}"
123

# 空文字・未設定のときはそのまま空となる
$ unset var
$ echo "${var:+123}"

${parameter:offset}, ${parameter:offset:length} 部分文字列の利用

# offset以降の部分文字列を展開
$ var="abc"
$ echo "${var:2}"
c

# offsetからlength文字の部分文字列を展開
$ echo "${var:1:2}"
bc

${!prefix*} ${!prefix@} 前方一致する変数名に展開

# prefixに前方一致する変数名に展開する
$ var="abc"
$ echo "${!va*}"
var

# 複数の変数がマッチする場合
$ var2="def"
$ echo "${!va*}"
var var2

${!name[*]} ${!name[@]} 配列のキーに展開

# nameの配列のキーに展開する
$ array=(abc def)
$ echo "${!array[@]}"
0 1

${#parameter} 文字列長に展開

# 文字列長に展開
$ var="abc"
$ echo "${#var}"
3

${parameter#word} 前方一致部分を除外(最短一致)

# 前方からwordのパターンに一致する部分を除外して展開
$ var="abcdef"
$ echo "${var#[abc]}"
bcdef

${parameter##word} 前方一致部分を除外(最長一致)

# 前方からwordのパターンに一致する部分を除外して展開。最長一致する
# (extglobが有効になっていないと発生しない?)
$ shopt -s extglob
$ var="abcdef"
# 最短一致
$ echo "${var#+([abc])}"
bcdef
# 最長一致
$ echo "${var##+([abc])}"
def

${parameter%word} 後方一致部分を除外(最短一致)

# 後方からwordのパターンに一致する部分を除外して展開
$ var="abcdef"
$ echo "${var%[def]}"
abcde

${parameter%%word} 後方一致部分を除外(最長一致)

# 後方からwordのパターンに一致する部分を除外して展開。最長一致する
# (extglobが有効になっていないと発生しない?)
$ shopt -s extglob
$ var="abcdef"
# 最短一致
$ echo "${var%+([def])}"
abcde
# 最長一致
$ echo "${var%%+([def])}"
abc

${parameter/pattern/string} パターンの置換

# patternをstringに置換する
$ var="abcdef"
$ echo "${var/abc/123}"
123def

${parameter^pattern} 大文字変換(1文字目がマッチした場合)

# 展開後の1文字目がマッチした場合大文字に変換する
$ var="abcdef"
$ echo "${var^[abc]}"
Abcdef
# 2文字目以降がマッチしても変換しない
$ echo "${var^[def]}"
abcdef

${parameter^^pattern} 大文字変換(全て)

# マッチした文字列をすべて大文字に変換する
$ var="abcdef"
$ echo "${var^^[bcde]}"
aBCDEf

${parameter,pattern} 小文字変換(1文字目がマッチした場合)

# 展開後の1文字目がマッチした場合小文字に変換する
$ var="ABCDEF"
$ echo "${var,[ABC]}"
aBCDEF
# 2文字目以降がマッチしても変換しない
$ echo "${var,[DEF]}"
ABCDEF

${parameter,,pattern} 小文字変換(全て)

# マッチした文字列をすべて小文字に変換する
$ var="ABCDEF"
$ echo "${var,,[BCDE]}"
AbcdeF

${parameter@operator} パラメータ変換

operatorに指定した内容の変換をおこなう。

# 英小文字を大文字に変換
$ var="abcDEF"
$ echo "${var@U}"
ABCDEF
# 1文字目が英字の場合大文字に変換
$ var="abcDEF"
$ echo "${var@u}"
AbcDEF
# 英大文字を小文字に変換
$ var="abcDEF"
$ echo "${var@L}"
abcdef
# 入力に再利用できる形式に変換
$ var="abc'DEF"
$ echo "${var@Q}"
'abc'\''DEF'
# など...

(その他) 配列の*@の展開

# 順番に引数を表示する
$ args(){
  while [ $# -gt 0 ]; do
    echo "${1}"
    shift
  done
}

$ var=(a b c d e f)

# 全ての要素がIFS区切りで1つの文字列として展開される。
$ args "${var[*]}"
a b c d e f

# 全ての要素が個別の文字列として展開される。
$ args "${var[@]}"
a
b
c
d
e
f

参考

  • man bash
  • 動作は次のバージョンで確認。
$ bash --version | head -n 1
GNU bash, version 5.1.16(1)-release (aarch64-unknown-linux-gnu)