====== 03 特殊な変数展開 ====== 変数にすでに値が入っている場合と何も値が入っていない場合で、動作が異なる代入/参照方法があります。\\ 変数に値が代入されていれば新たにそこには代入しないけれど、値が入っていないときには代入しよう、というif文的な動作をする書き方です。 ^ 変数 ^ 説明 ^ | ${VAR:-word} |変数VARに値が入っていないならwordを値として返す。| | ${VAR:=word} |変数VARに値が入っていないならwordを代入する。| | ${VAR:?word} |変数VARに値が入っていないならwordを出力する。| | ${VAR:+word} |変数VARに値が入っているならwordを代入する。| ====== Bashで追加された拡張的な変数展開 ====== ===== 変数の値を切り出す ===== ${variable:offset} ${variable:offset:length} マイナスを入れると後ろから指定 ${variable: -offset} ${variable: -offset:length} 変数variableに代入されている値に対して、offset番目からlength分の文字列を切り出します。 最初の文字列が0番目です。lengthを省略すると最後までとして解釈します。 * 変数VARの値の2番目から6個を切り出す。 $ VAR=0123456789 $ echo ${VAR:2:6} 234567 ===== 合致する変数名を表示 ===== ${!prefix*} 文字列prefixで始まる名前の**変数名**を全て表示します。 * VAR*と合致する**変数名**を全て表示する。 $ VAR_1=0123 $ VAR_2=abcd $ VAR_3=wxyz $ echo ${!VAR*} VAR_1 VAR_2 VAR_3 ===== 値の文字数を表示する ===== ${#variable} 変数variableに代入されている値(文字列)の文字数を表示します。\\ $#は位置パラメータの個数を表示しますが、それによく似ています。 * 変数VAR1とVAR2の文字数を表示する。 $ VAR1=0123 $ VAR2="abcd xyz" $ echo ${#VAR1} 4 $ echo ${#VAR2} 8 ===== 値を文字列指定(前方一致)で削除 ===== ${variable#word} ${variable##word} 変数variableに代入されている値(文字列)の\\ 先頭部分が文字列wordに合致する時に、そこまでの文字列を削除します。\\ #が1個だと最短一致パターンとなり、2個だと最長一致パターンとで判断します。\\ 文字列指定にはワイルドカードが使えます。 * 変数VARに代入されている値から最短一致でabcを削除 $ VAR=abc1234xyz987abcd1234efg $ echo ${VAR#abc} 123xyz987abcd1234efg * 変数VARに代入されている値から最短一致でaで始まって2で終わる文字列を削除 $ echo ${VAR#a*2} 3xyz987abcd1234efg * 変数VARに代入されている値から最長一致でaで始まって2で終わる文字列を削除 $ echo ${VAR##a*2} 34efg * 変数VARに代入されている値から最短一致で1234を削除 $ echo ${VAR#*1234} xyz987abcd1234efg * 変数VARに代入されている値から最長一致で1234を削除 $ echo ${VAR##*1234} efg ===== 値を文字列指定(後方一致)で削除する。 ===== ${variable%word} ${variable%%word} 変数variableの値(文字列)のうち、後方部分が文字列wordに合致する場合はそこまでの部分を削除します。\\ %が1個だと最短一致パターンとなり、2個だと最長一致パターンとで判断します。\\ 文字列指定にはワイルドカードが使えます。\\ * 最後尾の1234を削除 $ VAR=abcd1234xyz987abcd1234 $ echo ${VAR%1234} abcd1234xyz987abcd * 変数VARに代入されている値から最後尾の最短一致でdで始まって4で終わる文字列を削除 $ echo ${VAR%d*4} abc * 変数VARに代入されている値から最後尾最長一致でdで始まって4で終わる文字列を削除 $ echo ${VAR%%d*4} 34efg * 変数VARに代入されている値から最後尾最短一致で34を削除 $ echo ${VAR%34*} abcd1234xyz987abcd12 * 変数VARに代入されている値から最後尾最長一致で34を削除 $ echo ${VAR%%34*} abcd12 ===== 値を文字列指定で置き換える ===== ${variable/pattern/string} ${variable//pattern/string} 変数variableの値(文字列)が文字列パターンpatternに合致すればその部分を文字列stringに置き換えます。\\ patternにはワイルドカードが利用できる為、最短一致と最長一致とが使えます。\\ /が1個は最短一致で、2個の時は一致する全てを置き換えます。\\ 最短一致で1234をAAAに置き換える $ VAR=abcd1234xyz987abcd1234abcd $ echo ${VAR/1234/AAA} abcdAAAxyz987abcd1234abcd 最長一致で1234をAAAに置き換える $ VAR=abcd1234xyz987abcd1234abcd $ echo ${VAR/1234//AAA} abcdAAAxyz987abcdAAAabcd 1で始まりaで終わる部分をBBBに置き換える $ VAR=abcd1234xyz987abcd1234abcd $ echo ${VAR/1*a/BBB} abcdBBBbcd {{tag>bash}}