例題 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
参照)
(参考資料) 上表にはファイル属性に関する使い方を示した. その他の使い方についても以下に示しておく.
|