Bashシェルスクリプト/特殊な変数展開 の変更点


*特殊な変数展開 [#tacc1327]

[[dokuwiki.fl8.jp掲載済>http://dokuwiki.fl8.jp/doku.php/bash/03_special_variable]]

**変数の値の有無による設定/展開 [#n555b627]
変数にすでに値が入っている場合と何も値が入っていない場合で、動作が異なる代入/参照方法があります。~
変数に値が代入されていれば新たにそこには代入しないけれど、値が入っていないときには代入しよう、という[[if文>Bashシェルスクリプト/制御文#a310f3fa]]的な動作をする書き方です。
|200|600|c
|拡張的な変数展開|説明|h
|${VAR:-word}|変数VARに値が入っていないならwordを値として返す。|
|${VAR:=word}|変数VARに値が入っていないならwordを代入する。|
|${VAR:?word}|変数VARに値が入っていないならwordを出力する。|
|${VAR:+word}|変数VARに値が入っているならwordを代入する。|

**Bashで追加された拡張的な変数展開 [#g1a0d13a]

***変数の値を切り出す(${variable:offset}、${variable:offset:length}) [#v78f3ab8]
${variable:offset:length}は、変数variableに代入されている値に対して、offset番目からlength分の文字列を切り出します。~
最初の文字列が0番目です。lengthを省略すると最後までとして解釈します。

■例1:変数VARの値の2番目から6個を切り出す。
 $ VAR=0123456789
 $ echo ${VAR:2:6}
 234567
■例2:offsetやlength部分には算術式を指定できます。~
 (5-2)番目から(1+3)個分切り出す。
 $ VAR=0123456789
 $ echo ${VAR:(5-2):(1+3)}
 3456

***合致する変数名を全て表示する。(${!prefix*}) [#kff7f884]
${!prefix*}は、文字列prefixで始まる名前の変数を全て表示します。~
■例:VAR*と合致する変数名を全て表示する。
 $ VAR_1=0123
 $ VAR_2=abcd
 $ VAR_3=wxyz
 $ echo ${!VAR*}
 VAR_1 VAR_2 VAR_3

***変数の値の文字数を表示する(${#variable}) [#se74c8a4]
${#variable}は、変数variableに代入されている値(文字列)の文字数を表示します。~
$#は位置パラメータの個数を表示しますが、それによく似ています。

■例:変数VAR1とVAR2の文字数を表示する。
 $ VAR1=0123
 $ VAR2="abcd xyz"
 $ echo ${#VAR1}
 4
 $ echo ${#VAR2}
 8

***変数の値を文字列指定(前方一致)で削除する。(${variable#word}、${variable##word}) [#a3298f60]
${variable#word}と${variable##word}は、変数variableに代入されている値(文字列)の先頭部分が文字列wordに合致する時に、そこまでの文字列を削除します。~
#が1個だと最短一致パターンとなり、2個だと最長一致パターンとで判断します。~
文字列指定にはワイルドカードが使えます。

■例1:変数VARに代入されている値から最短一致でabcを削除
 $ VAR=abc1234xyz987abcd1234efg
 $ echo ${VAR#abc}
 123xyz987abcd1234efg
■例2:変数VARに代入されている値から最短一致でaで始まって2で終わる文字列を削除
 $ echo ${VAR#a*2}
 3xyz987abcd1234efg
■例3:変数VARに代入されている値から最長一致でaで始まって2で終わる文字列を削除
 $ echo ${VAR##a*2}
 34efg
■例4:変数VARに代入されている値から最短一致で1234を削除
 $ echo ${VAR#*1234}
 xyz987abcd1234efg
■例5:変数VARに代入されている値から最長一致で1234を削除
 $ echo ${VAR##*1234}
 efg

***変数の値を文字列指定(後方一致)で削除する。(${variable%word}、${variable%%word}) [#j391f12e]
${variable%word}と${variable%%word}は、変数variableの値(文字列)のうち、後方部分が文字列wordに合致する場合はそこまでの部分を削除します。~
%が1個だと最短一致パターンとなり、2個だと最長一致パターンとで判断します。~
文字列指定にはワイルドカードが使えます。

■例1:最後尾の1234を削除
 $ VAR=abcd1234xyz987abcd1234
 $ echo ${VAR%1234}
 abcd1234xyz987abcd
■例2:変数VARに代入されている値から最後尾の最短一致でdで始まって4で終わる文字列を削除
 $ echo ${VAR%d*4}
 abc
■例3:変数VARに代入されている値から最後尾最長一致でdで始まって4で終わる文字列を削除
 $ echo ${VAR%%d*4}
 34efg
■例4:変数VARに代入されている値から最後尾最短一致で34を削除
 $ echo ${VAR%34*}
 abcd1234xyz987abcd12
■例5:変数VARに代入されている値から最後尾最長一致で34を削除
 $ echo ${VAR%%34*}
 abcd12

***変数の値を文字列指定で置き換える(${variable/pattern/string}、${variable//pattern/string}) [#q949b183]
${variable/pattern/string}と${variable//pattern/string}は、変数variableの値(文字列)が文字列パターンpatternに合致すればその部分を文字列stringに置き換えます。~
patternにはワイルドカードが利用できる為、最短一致と最長一致とが使えます。~
/が1個は最短一致で、2個の時は一致する全てを置き換えます。

■例1:最短一致で1234をAAAに置き換える
 $ VAR=abcd1234xyz987abcd1234abcd
 $ echo ${VAR/1234/AAA}
 abcdAAAxyz987abcd1234abcd
■例2:最長一致で1234をAAAに置き換える
 $ VAR=abcd1234xyz987abcd1234abcd
 $ echo ${VAR/1234//AAA}
 abcdAAAxyz987abcdAAAabcd
■例3:1で始まりaで終わる部分をBBBに置き換える
 $ VAR=abcd1234xyz987abcd1234abcd
 $ echo ${VAR/1*a/BBB}
 abcdBBBbcd