覚え書きブログ

bashの覚え書き(変数展開編)

bashには変数の文字列を、他の文字列で展開する変数展開の機能がある。

>str=test
>echo $str.txt
test.txt

さらには、以下のように変数の文字列の一部を除いて展開することもできる。

  1. ${変数#パターン}:変数の文字列の先頭からパターンに一致した最短の部分を除く
  2. ${変数##パターン}:変数の文字列の先頭からパターンに一致した最長の部分を除く
  3. ${変数%パターン}:変数の文字列の最後からパターンに一致した最短の部分を除く
  4. ${変数%%パターン}:変数の文字列の最後からパターンに一致した最長の部分を除く

例えば、ファイルのパスからファイル名を除いた展開(ディレクトリ部分の抽出)は、次のようにすればできる。

>str=/home/hachiya/test.txt
>echo ${str%/*}
/home/hachiya

逆に、ファイルのパスからディレクトリを除いた展開(ファイル名の部分の抽出)は、次のようにすればできる。

>str=/home/hachiya/test.txt
>echo ${str##*/}
test.txt

これを応用すると、例えば、あるフォルダ内にある画像ファイルを、あるターゲットのフォルダにコピーする時に、そのターゲットのフォルダに無い画像ファイルのみをコピーするようなこととが次の1行で簡単にできる。

>ls source
1.jpeg  2.jpeg  3.jpeg

>ls target
2.jpeg

>for i in source/*.jpeg; do fname=${i##*/}; if [ ! -e target/$fname ]; then echo $fname; cp source/$fname target/$fname; fi; done
1.jpeg
3.jpeg

>ls target
1.jpeg  2.jpeg  3.jpeg