bashには変数の文字列を、他の文字列で展開する変数展開の機能がある。
>str=test >echo $str.txt test.txt
さらには、以下のように変数の文字列の一部を除いて展開することもできる。
- ${変数#パターン}:変数の文字列の先頭からパターンに一致した最短の部分を除く
- ${変数##パターン}:変数の文字列の先頭からパターンに一致した最長の部分を除く
- ${変数%パターン}:変数の文字列の最後からパターンに一致した最短の部分を除く
- ${変数%%パターン}:変数の文字列の最後からパターンに一致した最長の部分を除く
例えば、ファイルのパスからファイル名を除いた展開(ディレクトリ部分の抽出)は、次のようにすればできる。
>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