第 1 回 - フィルタ,シェルスクリプトの基礎(1)

[9/21, 2009 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 2】

例題 2

ファイル(ただし,テキストファイルに限る)が与えられると, そのファイル名,先頭と末尾の内容(三行ずつ)を表示するスクリプトを作りなさい.

(実行例)

     bash digest.sh foo.c
     === foo.c ===
     #include 

     int main(void)

     .....
     
     
        return 0;
     }

解答例

digest.sh の内容は以下の通り:
     echo "=== $1 ==="
     head -n 3 $1
     echo
     echo "....."
     echo
     tail -n 3 $1
     

解説

上記の内容を digest.sh として作成し,
     bash digest.sh xxx yyy zzz
という具合いに実行させると,コマンドライン引数 xxx, yyy 及び zzz はそれぞれ自動的にシェルスクリプト内の特別な変数へ記録され, 順番に $1, $2 及び $3 として参照できる.
つまり,シェルスクリプトの中では, n 番目のコマンドライン引数を $n として参照 できる.

この仕組みを利用して,スクリプト内では三種類のコマンドを活用している:

  • echo
    与えられた内容をそのまま出力する. 出力の最後には改行も行われる.
    ただし,-n オプションを指定すれば改行されない.
  • head
    tail の逆で,指定されたファイルの先頭部分を表示する.
  • tail
    例題 1 にて説明済.
(1)まず,1 行目から見ていくと,
     echo "=== $1 ==="
これにより,コマンドライン引数で 1 番目に与えられたファイル名が === で囲まれて出力される.
仮にこのスクリプトを
     bash digest.sh foo.c
という具合いに実行すれば, $1 は foo.c に置き換わる.

(2)2 行目では head コマンドを使って目的のファイル($1)の先頭から 3 行を出力している:

     head -n 3 $1

(3)3 〜 5 行目では再び echo コマンドを使って, 「途中が省略されていること」を表現している:

     echo
     echo "....."
     echo
なお,echo のみを書いた場合は何も出力せずに改行だけが行われる.

(4)最後の行では tail コマンドを使って目的のファイル($1)の末尾から 3 行を出力している:

     tail -n 3 $1

ゆえに,上の解答例に示したスクリプトを実行すると, コマンドライン引数で与えられたファイルの先頭と末尾の 3 行が(ダイジェストのかたちで)表示される.