${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)