IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第26回 bashの展開機能を知ろう(2) (宮崎悟) 2020年12月

前回はbashの展開機能の、ブレース展開とチルダ展開について説明しました。今回は、変数の配列と変数の展開について説明します。

変数の配列

bashは数値による配列と、任意の文字列を使用した連想配列の変数を扱うことができ、配列としてすべての変数を使用できます。declareコマンドを使用して明示的に配列を宣言できます。indexは0から始まる上限のない整数で連続していなくても構いません。連想配列は、任意の文字列を使用します。配列は、以下のように宣言、代入できます。

$ declare name
$ declare -a name[subscript]
$ name[0]=value
$ name=(aaa bbb ccc)
$ echo ${name[0]}
aaa
$ echo ${name[-1]}
ccc

name[]=valueのようにすると、配列nameの末尾にvalueが追加されます。

連想配列は以下のように宣言、代入できます。

$ declare -A name
$ name[key1]=value1
$ name[key2]=value2
$ echo ${name[key1]}
value1

配列および連想配列の値は、${name[index]}で参照可能です。

配列及び連想配列の値を削除するには、unset ${name[key]} のようにunsetコマンドを使用します。

変数の展開

$PARAMETERS および${PARAMETERS}は、シェル変数PARAMETERSの値を表します。${}の形式は、シェル変数直後に変数名の一部とみなされる文字を分離するために使用します。また、${}形式内に以下のように演算子とwordを使用することで、表示する変数に対する変更を行えます。wordには文字列だけでなく、変数値も指定できます。

デフォルト値の設定

以下のようにparameterがからであるときの動作を指定できます。

${parameter:-word}

parameterが指定されていないか空文字列の場合、parameterの代わりにwordを展開した文字列に置換します。parameterが設定されている場合、parameterを展開します。

$ echo $AAA                # AAAは空文字列
$ echo ${AAA:-aaa}        # デフォルト値aaa を設定
aaa                        # デフォルト値が表示される
$ echo $AAA                # AAA は空文字列のまま
$ aaa=${AAA:-bbb}        # AAA に代入すると、デフォルト値を設定可能
$ echo $AAA
bbb

${parameter:=word}

parameterが設定されていないか空文字列の場合、wordを展開した文字列をparameterに代入した後、parameterを展開します。parameterが設定されている場合、parameterを展開します。

$ echo $BBB                # BBBは空文字列
$ echo ${BBB:=bbb}        # デフォルト値bbbを指定すると、bbbが表示される
bbb
$ echo $BBB                # デフォルト値bbbが変数BBBに代入されている
bbb
$ echo ${BBB:=ccc}        # BBBが空文字列でないときは、代入されない
bbb

${parameter:?word}

parameterが設定されていないか空文字列の場合、wordをエラーメッセージとして標準エラー出力へ表示します。このときの終了コードは1で、エラーとなります。parameterが設定されている場合、parameterを展開します。

$ echo $ccc                        # 変数CCCはから 
$ echo ${ccc:?this is a error}    # エラーが表示される
-bash: ccc: this is a error
$ echo $?                        # 終了コードが1
1

${parameter:+word}

parameterが設定されていないか空文字列の場合、空文字列に置換します。parameterが設定されている場合、wordを展開したものが表示されます。

$ echo $DDD            # 変数DDDは空文字列
$ echo ${DDD:+ddd}    # 空文字列のときは表示されない
$ echo $DDD
$ DDD=ddd            # 変数DDDに文字列を設定
$ echo ${DDD:+eee}    # 変数DDDに文字列が指定されていると、デフォルト値eeeを表示
eee
$ echo $DDD            # 変数DDDは置換されない
ddd
部分指定した文字列

${parameter:offset:length}

parameterを展開したものから、先頭の文字をoffsetで指定し、最大lengthまで取り出します。offsetおよびlengthにマイナス値を設定すると、末尾からの文字位置となります。

$ string=0123456789ABCDEF    # 16文字の文字列を設定
$ echo ${string:5}            # 先頭を5文字ずらして表示
56789ABCDEF
echo ${string::5}            # 先頭から5文字分を表示
01234
$ echo ${string:5:-5}        # 先頭5文字ずらして、末尾5文字以前までを表示
56789A
変数名の一覧

${!prefix*}/${!prefix@}

prefix で始まるすべての変数名を展開し、IFS特殊変数の最初の文字によって区切ります。

$ zzz_aaa=aaa
$ zzz_bbb=bbb
$ zzz_ccc=ccc
$ zzz_ddd=ddd
$ zzz_eee=eee
$ echo ${!zzz_*}        # 変数名の一覧
zzz_aaa zzz_bbb zzz_ccc zzz_ddd zzz_eee
$ echo ${!zzz_@}        # 変数名の一覧
zzz_aaa zzz_bbb zzz_ccc zzz_ddd zzz_eee
配列

${!name[*]}/${!name[@]}

配列もしくは連想配列nameのキー値を表示します。

$ ARRAY=(aaa bbb ccc ddd eee fff)    # ARRAYの宣言
$ echo ${!ARRAY[*]}                    # ARRAYのindex値
0 1 2 3 4 5
$ echo ${!ARRAY[@]}
0 1 2 3 4 5
$ declare -A HASH                    # HASHの宣言
$ HASH[aaa]=aaaaaa
    (中略)
$ HASH[fff]=ffffff
$ echo ${HASH[aaa]}                    # HASH値の確認
aaaaaa
$ echo ${!HASH[*]}                    # HASHのkey値
aaa eee ccc fff bbb ddd
$ echo ${!HASH[@]}
aaa eee ccc fff bbb ddd

${name[*]}/${name[@]}

配列もしくは連想配列nameの各値を表示します。

$ echo ${ARRAY[*]}                # ARRAYの値
aaa bbb ccc ddd eee fff
$ echo ${ARRAY[@]}
aaa bbb ccc ddd eee fff
$ echo ${HASH[*]}                # HASHの値
aaaaaa eeeeee cccccc ffffff bbbbbb dddddd
$ echo ${HASH[@]}
aaaaaa eeeeee cccccc ffffff bbbbbb dddddd

${#name}

nameが変数の場合、文字列長を表示します。nameが配列もしくは連想配列で、[]内に\*もしくは@を含む場合、その要素数を表示します。

$ echo ${#string}        # 文字列数
16
$ echo ${#ARRAY[*]}        # 配列要素数
6
$ echo ${#HASH[@]}        # 連想配列要素数
6
文字列置換

文字列置換では、変数に定義した文字列を置換して表示します。変数が配列もしくは連想配列で、[*]もしくは[@]が指定された場合、配列の全要素に置換が適用されリストとして表示されます。

${parameter#word}/${parameter##word}

変数parameterの値から、wordで前方から最短マッチする文字列(*#指定時)、もしくは最長マッチする文字列(##*指定時)を取り除いて表示します。

$ sopath=/lib/libnetpbm.so.10.0
$ echo ${sopath#*/}                # 最短マッチ
lib/libnetpbm.so.10.0
$ echo ${sopath##*/}            # 最長マッチ
libnetpbm.so.10.0

${parameter%word}/${parameter%%word}

変数parameterの値から、wordで後方から最短マッチする文字列(*%指定時)、もしくは最長マッチする文字列(%%*指定時)を取り除いて表示します。

$ echo ${sopath%.*}                # 最短マッチ
/lib/libnetpbm.so.10
$ echo ${sopath%%.*}            # 最長マッチ
/lib/libnetpbm

${parameter/pattern/string}

変数parameterの値から、patternで最長マッチする文字を、stringで置き換えます。すべて末尾のstringは省略可能です。

  • pattarn/で始まる場合、patternにマッチした部分がすべてstringに置き換えられます
  • pattarn#で始まる場合、patternにマッチした最前方部分が置き換えられます
  • pattarn%で始まる場合、patternにマッチした最後尾部分が置き換えられます
$ parameter=abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter/b/B}                # 最初にマッチした部分を置き換え
aBcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter//b/B}            # すべてのマッチした部分を置き換え
aBcdefghijkaBcdefghijkaBcdefghijkaBcdefghijkaBcdefghijk
$ echo ${parameter/#b/B}            # 先頭のみ置き換え(先頭がbでないため置き換えられない)
abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter/#a/A}            # 先頭がAなので置き換えられる
Abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter/%b/B}            # 末尾のみ置き換え(末尾がb出ないため置き換えられない)
abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter/%jk/J}            # 末尾がjkなので置き換えられる
abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghiJ

${parameter^pattern}/ ${parameter^^pattern}/

${parameter,pattern}/${parameter,,pattern}

変数parameter内のpatternにマッチする文字列の、小文字を大文字に(^を指定)、または大文字を小文字に(,を指定)変換します。^/,はマッチした最初の部分を変換し、^^/,,はマッチしたすべての部分を変換します。patternが省略されたときは、すべての小文字を大文字に変換します。

$ parameter=abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter^}                # 先頭のみ大文字に変換
Abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
$ echo ${parameter^^[a-c]}            # [a-c]をすべて大文字に変換
ABCdefghijkABCdefghijkABCdefghijkABCdefghijkABCdefghijk
$ PARAMETER=${parameter^^}            # すべてを大文字に変換
$ echo $PARAMETER
ABCDEFGHIJKABCDEFGHIJKABCDEFGHIJKABCDEFGHIJKABCDEFGHIJK
$ echo ${PARAMETER,}                # 先頭だけ小文字に変換
aBCDEFGHIJKABCDEFGHIJKABCDEFGHIJKABCDEFGHIJKABCDEFGHIJK
$ echo ${PARAMETER,,[BDF]}            # [BDF]をすべて子文字に変換
AbCdEfGHIJKAbCdEfGHIJKAbCdEfGHIJKAbCdEfGHIJKAbCdEfGHIJK
$ echo ${PARAMETER,,}                # すべてを小文字に変換
abcdefghijkabcdefghijkabcdefghijkabcdefghijkabcdefghijk
終わりに

今回はbashの展開機能の、今回は、変数の配列と変数の展開について説明しました。次回は算術式展開、コマンド置換などについて説明します。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes