bashでは、変数展開時にパラメータ展開を使用することで任意の箇所を抜き出すなど、いろいろなことができる。 (個人的には、あまりbashのスクリプトを書かずにシェル芸で対応してしまうことが多いのであまり恩恵を受けてない気もするが…)

結構柔軟に指定できるので、ちゃんとbashのスクリプトを書くときには使えるはずだ。 以下のような指定方法が利用できる。

パラメータ展開 機能
${#変数} 変数の文字数を取得する
${変数:-文字列} 変数がNULLの場合、指定した文字列を返す
${変数:+文字列} 変数がNULL以外の場合、指定した文字列を返す
${変数:=文字列} 変数がNULLの場合、変数に指定した文字列を代入する
${変数:?文字列} 変数がNULLの場合、指定した文字列を返しエラー終了する
${変数#文字列} 変数より、前方から最短一致した箇所を除外する(基本ワイルドカード組み合わせ要)
${変数##文字列} 変数より、前方から最長一致した箇所を除外する(基本ワイルドカード組み合わせ要)
${変数%文字列} 変数より、後方から最短一致した箇所を除外する(基本ワイルドカード組み合わせ要)
${変数%%文字列} 変数より、後方から最長一致した箇所を除外する(基本ワイルドカード組み合わせ要)
${変数:N} 変数より、N文字以降の文字のみ抽出する
${変数:N:X} 変数より、N文字目からX個の文字を抽出する
${変数: -N} 変数より、後ろからN文字のみ抽出する
${変数: -N:X} 変数より、後ろからN文字、X個の文字のみ抽出する
${変数::N} 変数より、頭からN文字のみ抽出する
${変数::-N} 変数より、後ろからN文字除外する
${変数/置換前/置換後} 変数の内容を、置換前文字列を置換後文字列に変換して返す
${変数^[文字列]} 変数の一文字目を大文字にする(文字列を指定してる場合はその文字列のみを対象にする)
${変数^^[文字列]} 変数全体を大文字にする(文字列を指定してる場合はその文字列のみを対象にする)
${変数,[文字列]} 変数の一文字目を小文字にする(文字列を指定してる場合はその文字列のみを対象にする)
${変数,,[文字列]} 変数全体を小文字にする(文字列を指定してる場合はその文字列のみを対象にする)
${!文字列*} 指定された文字列から始まる変数を取得する

以下、それぞれについて実際の実行例を記載しておく。

${#変数} : 変数の文字数を取得する

[root@BS-PUB-CENT7-01 ~]# TEST1=1234567890
[root@BS-PUB-CENT7-01 ~]# TEST2=ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${#TEST1}
10
[root@BS-PUB-CENT7-01 ~]# echo ${#TEST2}
14

${変数:-文字列} : 変数がNULLの場合、指定した文字列を返す

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:-test}
test
[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:-test}
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890

${変数:+文字列} : 変数がNULL以外の場合、指定した文字列を返す

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:+test}

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:+test}
test
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890

${変数:=文字列} : 変数がNULLの場合、変数に指定した文字列を代入する

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:=test}
test
[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1
test
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:=test}
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890

${変数:?文字列} : 変数がNULLの場合、指定した文字列を返しエラー終了する

[root@BS-PUB-CENT7-01 ~]# echo $NULLTEST1

[root@BS-PUB-CENT7-01 ~]# echo ${NULLTEST1:?null}
-bash: NULLTEST1: null
[root@BS-PUB-CENT7-01 ~]# echo $?
1
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:?null}
1234567890
[root@BS-PUB-CENT7-01 ~]# echo $?
0

${変数#文字列} : 変数より、前方から最短一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
<span style="color: #0000ff;">ABCDEF</span><span style="color: #ff0000;">GABVDEFG</span>
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2#*F}
GABVDEFG

${変数##文字列} : 変数より、前方から最長一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2##*F}
G

${変数%文字列} : 変数より、後方から最短一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2%F*}
ABCDEFGABVDE

${変数%%文字列} : 変数より、後方から最長一致した箇所を除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2%%F*}
ABCDE

${変数:N} : 変数より、N文字以降の文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:3}
4567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2:9}
VDEFG

${変数:N:X} : 変数より、N文字目からX個の文字を抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:3:2}
45
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2:6:4}
GABV

${変数: -N} : 変数より、後ろからN文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1: -3}
890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG</span>
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2: -6}
BVDEFG

${変数: -N:X} : 変数より、後ろからN文字、X個の文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1: -4}
7890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1: -4:2}
78

${変数::N} : 変数より、頭からN文字のみ抽出する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::6}
ABCDEF

${変数::-N} : 変数より、後ろからN文字除外する

[root@BS-PUB-CENT7-01 ~]# echo $TEST1
12345<span style="color: #0000ff;">67890</span>
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::-5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDE<span style="color: #0000ff;">FGABVDEFG</span>
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::-9}
ABCDE

${変数/置換前/置換後} : 変数の内容を、置換前文字列を置換後文字列に変換して返す

  • /置換前/置換後 ... 一度だけ置換
  • //置換前/置換後 ... すべて置換
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1/123/abc}
abc4567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1//123/abc} # /hoge/fugaだと置換は一度だけ行われるので、全部を置換する場合は//hoge/fugaで指定する
abc4567890

${変数^[文字列]} : 変数の一文字目を大文字にする

[root@BS-PUB-CENT7-01 ~]# test1=abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo $test1
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^}
Abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^a}
Abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^b}
abcdefgabcdefg

${変数^^[文字列]} : 変数全体を大文字にする

[root@BS-PUB-CENT7-01 ~]# echo $test1
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^^}
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test1^^a}
AbcdefgAbcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test1^^<span style="color: #0000ff;">b</span>}
aBcdefgaBcdefg

${変数,[文字列]} : 変数の一文字目を小文字にする

[root@BS-PUB-CENT7-01 ~]# echo $test2
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,}
aBCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,a}
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,A}
aBCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,B}
ABCDEFGABCDEFG

${変数,,[文字列]} : 変数全体を小文字にする

[root@BS-PUB-CENT7-01 ~]# echo ${test1}
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test2}
ABCDEFGABCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,,}
abcdefgabcdefg
[root@BS-PUB-CENT7-01 ~]# echo ${test2,,A}
aBCDEFGaBCDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${test2,,<span style="color: #0000ff;">B</span>}
AbCDEFGAbCDEFG

${!文字列*} : 指定された文字列から始まる変数を取得する

[root@BS-PUB-CENT7-01 ~]# set | grep ^TE
TERM=xterm
TEST=ABCD1234ABCD
TEST1=1234567890
TEST2=ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${!TE*}
TERM TEST TEST1 TEST2

参考