例題 3コマンドライン引数として指定されたファイルについて, それが存在すればそのファイルの行数を表示し, 存在しない場合は「見つかりません」と表示するシェルスクリプト linecounter.sh を作りなさい.ただし,行数のカウントには wc コマンドを利用すること. 解答例if [ -f $1 ] then wc -l $1 | cut -d " " -f 1 else echo 存在しません fi ※計算機室で使用する wc コマンドのバージョンでは, 行数を出力する際に複数のスペースが入ってしまい cut がうまくいかないようです. wc -l $1 | cut -d " " -f 1 を次の二行に置き換えてみてください: count=$(wc -l $1) echo $count | cut -d " " -f 1 解説前回説明したように, コマンドライン引数として与えられる ファイルの名前は $1 として参照できる.
ここでポイントなのは,
このファイル($1)が現実に存在しているかどうかを判定し,
その判定結果によって
次に実行すべきコマンドを使い分ける
ということである.
bash でも if という構文は用意されており,以下のように記述する: if 条件 then 条件が成り立つ時に実行するコマンド列 else 条件が成り立たない時に実行するコマンド列 fi ただし,else とそれに続くコマンド列は省略できる. if 文の終りが,fi (if を逆さまに書いている)であることに注意されたい. これは記述ミスではなく,こういう規則になっている. また,then や else, fi の前後には必ず改行が必要である. どうしても改行したくない場合は,途中にセミコロン(;)を書けばよい. 条件部について,上の回答例では [ -f $1 ]と書いている. これは「ファイル $1 が存在する」という条件を意味している. なお,[ や -f 等の前後には必ず空白文字(スペース)を入れること. ※これはややマニアックな話であるが,実は [ というのは一つのコマンドである (/usr/bin に置いてある). つまり,[ というコマンドを実行していて,そのオプションや引数として -f や $1, ] を書いている. -f 以外にもオプションはいくつか用意されている. ファイル属性に関する使い方を以下に示す:
もしも複数の条件を組み合わせたければ, && や || を使って if [条件] && [条件] then ....などとする. then 部で書いてある wc -l $1 | cut -d " " -f 1と else 部で書いてある echo 存在しませんについては,説明の必要はないと思われるので割愛する. (コマンド解説 wc, cut 参照)
(参考資料) 上表にはファイル属性に関する使い方を示した. その他の使い方についても以下に示しておく.
|