変数の展開について

変数展開の一覧(削除・置換系)

記法 動作内容
${変数名#パターン} 前方一致で削除(最短マッチ)
${変数名##パターン} 前方一致で削除(最長マッチ)
${変数名%パターン} 後方一致で削除(最短マッチ)
${変数名%%パターン} 後方一致で削除(最長マッチ)
${変数名/対象文字列/置換文字} 文字列置換(最初に一致した文字列)
${変数名//対象文字列/置換文字} 文字列置換(一致した文字列すべて)

変数展開(前方一致で削除)

code
var=A,B,C,D

echo "${var}"
echo '前方一致で削除(最短マッチ)'
echo "${var#*,}"

echo '前方一致で削除(最長マッチ)'
echo "${var##*,}"
stdout
A,B,C,D
前方一致で削除(最短マッチ)
B,C,D
前方一致で削除(最長マッチ)
D

変数展開(後方一致で削除)

code
var=A,B,C,D

echo "${var}"
echo '後方一致で削除(最短マッチ)'
echo "${var%,*}"

echo '後方一致で削除(最長マッチ)'
echo "${var%%,*}"
stdout
A,B,C,D
後方一致で削除(最短マッチ)
A,B,C
後方一致で削除(最長マッチ)
A

変数展開(文字列置換)

code
var=A,B,C,D

echo "${var}"
echo '文字列置換(最初に一致した文字列)'
echo "${var/,/ }"

echo '文字列置換(一致した文字列すべて)'
echo "${var//,/ }"
stdout
A,B,C,D
文字列置換(最初に一致した文字列)
A B,C,D
文字列置換(一致した文字列すべて)
A B C D

変数展開の一覧(初期化系)

記法 動作内容
${変数名:-デフォルト値}変数が未定義または空文字の場合、デフォルト値を使用する
${変数名:=デフォルト値}変数が未定義または空文字の場合、変数にデフォルト値を設定する
${変数名:?メッセージ} 変数が未定義または空文字の場合、メッセージを表示してエラーにする
${変数名:+デフォルト値}変数が未定義または空文字の場合、空文字を使用する。そうでない場合にデフォルト値を使用する

変数の展開(デフォルト値の使用)

code
var1=

# デフォルト値を使用する
echo "${var0:-default0}"
echo "${var1:-default1}"

# 変数の値は変更されない
echo "var0=${var0}"
echo "var1=${var1}"
stdout
default0
default1
var0=
var1=
code
var1=

# デフォルト値を使用して変数に代入
var0="${var0:-default0}"
var1="${var1:-default1}"

echo "var0=${var0}"
echo "var1=${var1}"
stdout
var0=default0
var1=default1

変数の展開(デフォルト値の代入)

code
var1=

# var0, var1 にデフォルト値を代入する
echo "${var0:=default0}"
echo "${var1:=default1}"

# 変数の値は変更される
echo "var0=${var0}"
echo "var1=${var1}"
stdout
default0
default1
var0=default0
var1=default1

変数の展開(未定義または空白はエラーにする)

code
echo "${var0:?var0が設定されていません}"
stdout
stderr
line 1: var0: var0が設定されていません
code
var1=
echo "${var1:?var1が設定されていません}"
stdout
stderr
line 2: var1: var1が設定されていません

変数の展開(設定されている場合はデフォルト値を使用)

code
var1=value1
# var1は設定されてるのでデフォルト値になる
echo "${var1:+default1}"
stdout
default1
code
var1=
# var1は空白なので空白になる
echo "${var1:+default1}"
stdout

変数展開の一覧(文字列の切出し)

記法 動作内容
${#変数名} 文字列の文字数に展開される
${変数名:インデックス} 文字列からインデックス以降の文字列を切出す
${変数名:インデックス:文字数} 文字列からインデックス以降から指定した文字数の文字列を切出す

変数の展開(文字列の文字数を取得する)

英字だけの場合は文字数を正しく取得できましたが、日本語の場合は想定と異なる結果になっています。

code
# LANGを設定していない場合
var1=abcde
var2=あいうえお
var3=𩸽を食べた

echo "LANG=${LANG}"
echo "var1の文字数=${#var1}"
echo "var2の文字数=${#var2}"
echo "var3の文字数=${#var3}"
stdout
LANG=
var1の文字数=5
var2の文字数=15
var3の文字数=16

LANG 変数にローケルを設定することで日本語の文字数も正しく取得することができます。

code
# LANGを設定した場合
LANG=C.UTF8
var1=abcde
var2=あいうえお
var3=𩸽を食べた

echo "LANG=${LANG}"
echo "var1の文字数=${#var1}"
echo "var2の文字数=${#var2}"
echo "var3の文字数=${#var3}"
stdout
LANG=C.UTF8
var1の文字数=5
var2の文字数=5
var3の文字数=5

変数展開(文字列からインデックス以降の文字列を切出す)

英字だけの場合は正しく切出すことができましたが、日本語の場合は想定と異なる結果になっています。

code
# LANGを設定していない場合
var1=abcde
var2=あいうえお
var3=𩸽を食べた

echo "LANG=${LANG}"
# インデックスの開始は0なので4文字目以降を指定する場合は3を指定する
echo "var1の4文字目以降=${var1:3}"
echo "var2の4文字目以降=${var2:3}"
echo "var3の4文字目以降=${var3:3}"
stdout
LANG=
var1の4文字目以降=de
var2の4文字目以降=いうえお
var3の4文字目以降=�を食べた

LANG 変数にローケルを設定することで日本語の文字列も正しく切出すことができます。

code
# LANGを設定した場合
LANG=C.UTF8
var1=abcde
var2=あいうえお
var3=𩸽を食べた

echo "LANG=${LANG}"
# インデックスの開始は0なので4文字目以降を指定する場合は3を指定する
echo "var1の4文字目以降=${var1:3}"
echo "var2の4文字目以降=${var2:3}"
echo "var3の4文字目以降=${var3:3}"
stdout
LANG=C.UTF8
var1の4文字目以降=de
var2の4文字目以降=えお
var3の4文字目以降=べた

変数展開(文字列からインデックス以降から指定した文字数のの文字列を切出す)

英字だけの場合は正しく切出すことができましたが、日本語の場合は想定と異なる結果になっています。

code
# LANGを設定していない場合
var1=abcde
var2=あいうえお
var3=𩸽を食べた

echo "LANG=${LANG}"
echo "var1の3文字目から2文字=${var1:2:2}"
echo "var2の3文字目から2文字=${var2:2:2}"
echo "var3の3文字目から2文字=${var3:2:2}"
stdout
LANG=
var1の3文字目から2文字=cd
var2の3文字目から2文字=��
var3の3文字目から2文字=��

LANG 変数にローケルを設定することで日本語の文字列も正しく切出すことができます。

code
# LANGを設定した場合
LANG=C.UTF8
var1=abcde
var2=あいうえお
var3=𩸽を食べた

echo "LANG=${LANG}"
echo "var1の3文字目から2文字=${var1:2:2}"
echo "var2の3文字目から2文字=${var2:2:2}"
echo "var3の3文字目から2文字=${var3:2:2}"
stdout
LANG=C.UTF8
var1の3文字目から2文字=cd
var2の3文字目から2文字=うえ
var3の3文字目から2文字=食べ