シェル変数展開のまとめ

12月 26, 2009

シェルにおける変数展開について。
変数展開{ }(ブレース)の中で各種文学列演算子を使い、変数の存在や値をチェック
することができる。-,=,?,+演算子使用時に「:」を付加していれば値がヌルかどうか
をチェックする。
省略された場合、値がヌルかどうかのチェックはせず、評価する変数が定義されて
いるかどうかのみチェックする。

${var:-str}
シェル変数が未設定か値がヌルの場合、指定した値を返す。
この時変数varに値は代入されない。

$ echo ${animal} ←変数が未設定
$ echo ${animal:-cat}
cat
$ echo $animal ←変数は設定されていない


${var:=str}
シェル変数が未設定か値がヌルの場合に指定した値を返し、さらに変数varに値が代入される。

$ echo $animal ←変数が未設定
$ echo ${animal:=dog}
dog
$ echo $animal
dog ←変数にdogがセットされた


${var:?str}
シェル変数が未設定か値がヌルの場合、シェル変数名の後に指定した文学列を返す。
また文字列「シェルプログラム名:var: str」を標準エラー出力に表示し、現在実行中
のスクリプトを中止する。

$ echo $animal
$ echo ${animal:?dog}
-bash: animal: dog
$ echo ${animal:?}
-bash: animal: parameter null or not set


これが値がセットされている状態であればエラーにならない。

$ echo $animal
dog      ←変数にdogがセットされている状態
$ echo ${animal:?} ←値セットを改めて確認
dog
$ echo ${animal:?dog} ←値dogのセットを改めて確認
dog


${var:+str}
シェル変数が設定されていて値がヌルでない場合、指定した値を返す。
変数が未設定か値がヌルの場合はヌルを返す。

$ echo $animal ←変数が未設定
$ echo ${animal:+monkey} ←変数が未設定
$ animal=dog ←変数animalに値dogをセット
$ echo $animal
dog
$ echo ${animal:+monkey}
monkey ←変数が設定されており値がヌルでないため、指定の値を返す
$ echo $animal
dog ←しかし設定されている値は「dog」


${var:n:n} ※${var:offset:length}
${var:n}

ここでのn:nはoffset:lengthとなり、変数varのn番目からn個の文学が展開される。
lengthが省略された場合、(offset)番目から最後までが展開される。

$ echo $animal
$ animal=”cat dog monkey cow”
$ echo $animal
cat dog monkey cow
$ echo ${animal:3:4}
dog
$ echo ${animal:3}
dog monkey cow


${var#pattern}
${var##pattern}

varの値の先頭からpatternにマッチする部分が削除された状態で展開される。
#の場合は最短一致、##は最長一致となる。patternにはパス名の展開と同じ規則
が適用される。

$ echo ${animal}
$ animal=”monkey:cat:dog:cow”
$ echo ${animal}
monkey:cat:dog:cow
$ echo ${animal#monkey}
:cat:dog:cow ←monkeyが削除された状態で出力
$ echo ${animal#m?}
nkey:cat:dog:cow
$ echo ${animal#m*}
onkey:cat:dog:cow
$ echo ${animal##m*}


${var%pattern}
${var%%pattern}

#と逆でvarの値の後ろからpatternにマッチする部分が削除された状態で展開される。%の場合は最短一致、%%は最長一致となる。patternにはパス名の展開と同じ規則が適用される。

${var/pattern/str}
${var//pattern/str}
${var/pattern}
${var//pattern}

varの値のうちpatternにマッチする部分がstrに置換された状態で展開される。
/の場合は最初にマッチした部分のみが、//の場合はマッチする部分すべてが置き換えられる。

$ echo ${meal} ←変数が未設定
$ meal=”catfood:catmilk”
$ echo $meal
catfood:catmilk
$ echo ${meal/cat/dog}
dogfood:catmilk ←最初にマッチした”cat”のみdogに置換
$ echo ${meal//cat/dog}
dogfood:dogmilk ←すべての”cat”がdogに置換された


${#var}
変数varの値の文字列に置き換えられる。

Categories: shell

No Responses so far | Have Your Say!

Comments are closed.