Linux‎ > ‎

特殊な変数展開


少し特殊な変数展開の記述についてメモしておきます。ただしどの記法も一般に見慣れない書き方であり認知度も低いであろう為、多くの人にとって分かりにくいコードになるはずだと思います。そのため、個人的なスクリプトを作成する場合のみの使用にするか、他の人が読むようなソースに使用する場合にはその記法に関するコメントをきちんと書くようにしたほうがいいでしょう。 

条件付変数展開

通常ならIF文を書いて処理分けをする内容を簡易に記述する方法。
表現 説明
${変数名:-文字列} 変数が存在し空でなければその値を返す。それ以外の場合は「文字列」を返す。(デフォルト値の使用)
${変数名:=文字列} 変数が存在し空でなければその値を返す。それ以外の場合は「文字列」を返し、さらに変数に文字列を設定する(デフォルト値の使用と設定)
${変数名:?文字列} 変数が存在し空でなければその値を返す。それ以外の場合は「文字列」を出力してシェルを終了する。(入力チェック)
${変数名:+文字列} 変数が存在し空でなければその「文字列」を返す。それ以外なら空を返す。(変数の存在チェック?つかわなそう…)

変数からの文字列部分切出し

文字列の切り出しが簡易に出来る。とても便利!
表現 説明
${変数名:位置} 指定位置から末尾までの部分文字列を返す。※「位置」は0から開始。
${変数名:位置:長さ} 指定位置から長さ分の部分文字列を返す。

変数からの簡易文字列編集

パターンマッチングを使用した文字列編集も出来ます。ただ、一般的な正規表現が使えないため、私には使いづらいです…。単純な文字列パターンのときには有効です。「[0-9]」「[abc]」の等表現はOK、「*」は任意の文字列扱いになります。「任意の回数の繰り返し」は表現できません。
表現 説明
${変数名#パターン} 変数の先頭がパターンマッチした場合、最短マッチ部分を削除した文字列を返す。
${変数名##パターン} 変数の先頭がパターンマッチした場合、最長マッチ部分を削除した文字列を返す。
${変数名%パターン} 変数の末尾がパターンマッチした場合、最短マッチ部分を削除した文字列を返す。
${変数名%%パターン} 変数の末尾がパターンマッチした場合、最長マッチ部分を削除した文字列を返す。
${変数名/パターン/文字列} 最初にパターンマッチした部分を文字列で置換した文字列を返す。
${変数名//パターン/文字列} パターンマッチしたすべての部分を文字列で置換した文字列を返す。


使用例
ACNT="2011/12/31 (account:123456) abcAction"
echo ${ACNT}
echo

# 数字をすべて「*」で置換
echo "${ACNT//[0-9]/*}"
# accountの値を「*」で置換
echo "${ACNT//account:[0-9][0-9][0-9][0-9][0-9][0-9]/account:******}"
echo "${ACNT//(*)/(account:******)}"

# accountの部分を削除
echo "${ACNT// (*)/}"

# 日付部分を削除
echo "${ACNT:11}"
echo "${ACNT#*[0-9] }"
echo "${ACNT##*[0-9] }"

実行結果
2011/12/31 (account:123456) abcAction

****/**/** (account:******) abcAction
2011/12/31 (account:******) abcAction
2011/12/31 (account:******) abcAction
2011/12/31 abcAction
(account:123456) abcAction
(account:123456) abcAction
(account:123456) abcAction