notes.kagcc

Bash の変数/文字列操作 (Parameter Substitution)

Bash では,たとえば f="IMG_0001.JPG" のとき, ${f%.JPG}IMG_0001 が取れる.だいぶ以前にすこし触れたことがあって, そのときには これ とかを参照したが,ここにもメモを残しておく.

用語の整理

echo {01..10}.txt みたいなのは brace expansion と呼ばれるが,それとはまた違ってですね….

多分 Linux Documentation Project にある Advanced Bash-Scripting Guide では, Chapter 10 Maniplating Variables のなかの Parameter substitution とか string operations とかで扱われている内容で,

Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command.

ともあるので,用語の混乱も致し方なし…という雰囲気.和文献では

しているようだ.

ざっと見る

自分が直近使いそうな気がするやつだけ抜き出す

変数定義されてるかどうかによって変わる系

${parameter-default}, ${parameter:-default} # 未定義なら default
${parameter=default}, ${parameter:=default} # 未定義なら default に set

変数の文字列操作

長さ・index 系

f="IMG_0001.JPG"
echo ${#f}           # => 12, 長さ
echo ${f:5}          # => 001.JPG, offset 5 から
echo ${f:4:4}        # => 0001, offset 4 から最大4文字
                     # {var:pos:len}

マッチ・置換などの操作系

echo ${f#IMG_}       # => 0001.JPG, 前から Pattern を削除
echo ${f##IMG_}      # => こっちは最長マッチ,↑は最短マッチ

echo ${f%.JPG}       # => IMG_0001, 後ろから Pattern を削除
echo ${f%%.JPG}      # => IMG_0001, 同様に最長マッチ


echo ${f/JPG/png}    # => IMG_0001.png, 置換
echo ${f/0/Zero}     # => IMG_Zero001.JPG
echo ${f//0/Zero}    # => IMG_ZeroZeroZero1.JPG, global replacement

echo ${f/%JPG/png}   # => IMG_0001.png, 末尾に合致したら置換. # も同様にある

g="out.tiff"
echo ${g/%.JPG/.png}   # => out.tiff
echo ${g%.JPG}.png     # => out.tiff.png

h="IMG"
echo ${f#$h}         # => _0001.JPG, こういうのもできる

ちょっとした処理をその場でするときに便利ですね.

tags: