連載
» 2018年06月15日 05時00分 公開

Linux基本コマンドTips(216):【 for 】コマンド(応用編)――パラメーター展開と組み合わせて、繰り返し処理を行う

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、同じ処理を繰り返し実行する「for」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は同じ処理を繰り返し実行する「for」コマンドです。

forコマンドとは?

 「for」は、何かの条件を指定して、繰り返し処理を行う際に使うbashの内部コマンドです。「1から10まで」のように具体的に数を指定して繰り返す他、ファイル全体の数が分からなくても、指定したファイル1つ1つに対して処理を実行したいときに使います。

 forコマンドは主にシェルスクリプトで使用します。しかし、コマンドラインで複数ファイルに対して同じ処理を施すときにも役立ちます。



forコマンドの書式

for 変数 in リスト; do コマンド; done

for ((式1; 式2; 式3)); do コマンド; done

※do以下のコマンドを複数書く場合は「;」で区切る。「;」の位置で改行できる。
※「((式1; 式2; 式3))」の使い方については、この後の連載で取り上げる。





forの主なオプション

 forコマンドにはオプションはありません。

bashの主なパラメーター展開

書式 意味
${変数:-文字列} 変数が未設定または空の場合、指定した文字列を使用する
${変数:=文字列} 変数が未設定または空の場合、指定した文字列を変数にセットする
${変数:?文字列} 変数が未設定または空の場合、エラーとし、指定した文字列を出力する
${変数:+文字列} 変数が未設定または空ではない場合、指定した文字列を変数にセットする
${変数:位置:長さ} 指定した位置から、指定した長さ(最大長)分を取り出す(※1)
${変数:位置} 指定した位置以降全てを取り出す(※1)
${変数::長さ} 先頭から指定した長さ分を取り出す
${変数::-長さ} 末尾から指定した長さ分を取り出す
${!接頭辞*} 先頭部分が一致する変数名を取得
${!接頭辞@} 先頭部分が一致する変数名を取得
${#変数} 変数の長さ
${変数#パターン} パターンに前方一致した部分を取り除く(最短一致、※2)
${変数##パターン} パターンに前方一致した部分を取り除く(最長一致、※2)
${変数%パターン} パターンに後方一致した部分を取り除く(最短一致)
${変数%%パターン} パターンに後方一致した部分を取り除く(最長一致)
${変数/パターン/文字列} 指定したパターンを文字列で置き換える
${変数^パターン} パターンにマッチした最初の文字を、小文字から大文字に変換する
${変数^^パターン} パターンにマッチした文字全てを、小文字から大文字に変換する
${変数,パターン} パターンにマッチした最初の文字を、大文字から小文字に変換する
${変数,,パターン} パターンにマッチした文字全てを、大文字から小文字に変換する

※1 マイナスの位置を指定した場合は末尾から数える。
※2 tempという変数の内容が「/usr/bin/man」の場合、${temp#*/}は「usr/bin/man」、${temp##*/}は「man」となる。





パラメーター展開と組み合わせて使用する(1)

 bashでは、「${変数名}」という書式で、変数に格納されている文字列の文字数を取得したり、一部を取り出したり、変換したりできます。これをパラメーター展開と呼びます。

 forコマンドの基礎編(連載第215回)では、「for f in *.txt 〜」を使って、カレントディレクトリの「*.txt」を対象に処理を行いました。

 第215回と同じ題材を使って、ファイル名から拡張子部分(ここでは「.txt」)を取り除いてみましょう。幾つか方法があります。

 例えば「末尾の4文字を取り除く」のであれば、「${変数名::-4}」のように指定します。取り除きたい拡張子の長さが今回のように3文字だと分かっている場合は、この方法が簡単です。

 拡張子の長さが決まっていない場合は、「文字『.』とそれ以降を取り除く」という方法があります。「${変数名%.*}」または「${変数名%%.*}」のように指定します。両者の違いは取り除く部分を最短一致にするか、最長一致にするかです。例えば、変数の値が「test.tar.gz」だった場合、「${変数名%.*}」ならば、最短一致となるため、結果は「test.tar」です。「${変数名%%.*}」であれば最長一致なので「test」となります。

 画面1では、zipコマンド(第34回)を使い、カレントディレクトリにある「*.txt」を個別のzipファイルに圧縮しています(※3)。

※3 zipコマンドは、通常、複数のファイルを1つの圧縮ファイルにまとめる際に使う。ファイルを個別に圧縮したい場合、gzipコマンド(第39回)やbzip2コマンドを使用する。gzipやbzip2コマンドはUnix系OSでは一般的なコマンドだが、Windows環境で使用するには別途ソフトを追加する必要がある。



コマンド実行例

for 変数 in リスト; do コマンド; done

(リストに対してコマンドを実行する)

for f in *.txt; do zip ${f%%.*} $f; done

(*.txtを、個別にzip形式で圧縮する)(画面1


画面1 画面1 bashのパラメーター展開とforコマンドを組み合わせて使ったところ *.txtファイルを1つずつzipファイルに圧縮している。


パラメーター展開と組み合わせて使用する(2)

 パラメーター展開では、文字列の置換もできます。例えば、拡張子「.txt」を「.doc」に変更するのであれば、${変数/パターン/文字列}というパラメーター展開を利用して、画面2のように実行します(※4)。

※4 mvコマンド(第22回)はファイルやディレクトリを移動するコマンドだが、名前の変更にも使用する。変更先の名前が既に使われている場合は、ファイルを上書きしてしまうため、注意が必要だ。確認しながら実行したい場合は「-i」オプションを付ける。



コマンド実行例

for f in *.txt; do mv $f ${f/.txt/.doc}; done

(*.txtを*.docにリネームする)(画面2


画面2 画面2 bashのパラメーター展開とforコマンドを組み合わせて使ったところ *.txtファイルを1つずつ*.docにリネームしている。


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。