シェル・スクリプト

					2012年06月22日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2012/2012-06-22
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■復習

■シェル・スクリプト

(よく利用する)シェルに対するコマンドを、ファイルに保存して、(簡単に) 実行できるようにしたもの。簡単なプログラミングとも言える。

◆bash

Coins での標準のログインシェルは、bash。端末(iTerm, xterm, ktermなど)を 開いたり、ssh で遠隔ログインすると、ログインシェルが実行される。

bash (Bourne-Again SHell) は、sh (Bourne Shell)の機能を強化したもの。 シェル・スクリプトを書く時には、多くのシステムで備わっている /bin/sh を 使うことも多い。(/bin/sh はあるが /bin/bash がないシステムもある。)

◆シェル・スクリプトの作り方(1):基本

まず端末から実行してみる。
$ ls ~/Desktop | nkf -e [←]
(デスクトップにあるファイルの一覧の表示。
漢字を含む名前のファイルも、nkf -e の働きで表示される。)
$ []
echo コマンド、history コマンド、あるいは、コピー&ペースト機能を用いて 端末から打ち込んだものを結果をファイルに保存する。以下の例では、echo コ マンドを使ってファイルを作成している。
$ ls ~/Desktop | nkf -e  [←]
(^p で1行もどす。^a で、行頭に移動して 「echo '」と打ち、^e して
「' > ls-desktop」 と打つ)
$ echo 'ls ~/Desktop | nkf -e' >  ls-desktop  [←]
$ cat ls-desktop  [←]
ls ~/Desktop | nkf -e
$ ls -l ls-desktop  [←]
-rw-r--r--  1 yas  prof  22  6 17 11:59 ls-desktop
$ []
不要な部分をエディタで削除すれば、シェル・スクリプトの完成である。この 例では不要な部分がないので、シェル・スクリプト ls-desktop は完成してい る。完成したシェル・スクリプトを実行するには、次のようにbash コマンドの 引数としてファイル名を指定すればよい。
$ bash ls-desktop [←]
(デスクトップの表示)
$ []
bash で動くものは、sh でも動くことが多い。
$ sh ls-desktop [←]
(デスクトップの表示)
$ []

◆シェル・スクリプトの作り方(2):chmod +x

シェル・スクリプトを実行する度にいちいち「bash 」と打つのは煩わ しいことがある。その場合は、次のようにする。

1行目にテキスト・エディタで #!/bin/bash と書き加える。

$ emacs ls-desktop [←]
(1行目に「#!/bin/bash [←]」と書き加える。)
$ cat ls-desktop [←]
#!/bin/bash
ls ~/Desktop | nkf -e
$ []
chmod +x で実行可能属性を付ける
$ ls -l ls-desktop [←]
-rw-r--r--  1 yas  prof  34  6 17 12:09 ls-desktop
$ chmod +x ls-desktop [←]
$ ls -l ls-desktop [←]
-rwxr-xr-x  1 yas  prof  34  6 17 12:09 ls-desktop
$ []
ファイル名を指定すると、実行することができる。ファイル名としては、明示 的に相対パス名であることを示すために先頭に「./」を付けるか、ホー ムディレクトリにあるこを示すために「~/」を付ける(ホーム・ディレ クトリにあることを仮定している)。
$ ./ls-desktop  [←]
(デスクトップの表示)
$ ~/ls-desktop  [←]
(デスクトップの表示)
$ []

◆シェル・スクリプトの作り方(3):~/bin

完成したスクリプトを ~/bin に置くと、他のコマンド(ls, cp, emacs) 等と同じように実行することができる。
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv ls-desktop ~/bin [←]
$ ls-desktop [←]
(デスクトップの表示)
$ []

◆シェル・スクリプトの作り方(4):引数

シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 The Unix Super Text 40.13.2 参照

ls-desktop では、「デスクトップ」だけ表示できる。これはこれで便利である が、他の漢字を含む任意のディレクトリを表示したいという要求もある。たと えば、「書類」や「ダウンロード」も表示できるようにしたい。そこで、「引 数」としてディレクトリ名を含むようにする。シェル・スクリプトの名前を 「ls-e」 とする。

$ cd ~/bin [←]
$ ls -l ls-desktop  [←]
-rwxr-xr-x  1 yas  prof  34  6 17 12:09 ls-desktop
$ cp ls-desktop ls-e [←]
$ ls -l ls-e [←]
-rwxr-xr-x  1 yas  prof  34  6 17 13:16 ls-e
$ emacs ls-e [←]
(修正)
$ cat ls-e [←]
#!/bin/bash
ls $* | nkf -e
$ ls -l ls-e [←]
-rwxr-xr-x  1 yas  prof  27  6 17 13:15 ls-e
(cp の時点で x ビットは立っているので chmod +x は不要。)
$ ls-e ~/Desktop [←]
(デスクトップの内容)
$ ls-e ~/Downloads [←]
(「ダウンロード」の内容)
$ []
この例では、ls-desktop の「~/Desktop」を「$*」に置き換えている。「$*」 は、コマンドに与えられた全ての引数ということを意味している。

◆bashのコメント

bash では、「#」を使ってコメントを書くことができる。bash は、 文字「#」移行、行末まで無視する。
$ echo a b # c d [←]
a b
$ # echo a b c [←]
$ []

◆~/.bashrc

bash は、iTerm の中で新たに実行されたり(遠隔)ログインの時に新たに実行さ れると、~/.bashrc という名前のファイルにあるプログラムを自動的 に実行する。~/.bashrc では、次のようなことを行う。

◆環境変数PATH

環境変数PATHは、シェルのコマンドが含まれているディレクトリを設定するた めの環境変数である。 環境変数PATHも、参照。 シェルは、コマンドのファイル名(相対パス名、または、絶対パス名) を与えると、プログラムを実行する。 例:
$ /usr/bin/emacs [←]
$ /bin/ls [←]
環境変数 PATH にディレクトリ名を登録しておくと、ディレクトリ名を省略す ることができる。 例:
$ echo $PATH [←]
(省略):/usr/bin:/bin:(省略)
$ emacs [←]
$ ls [←]

◆~/.bashrcでのシェル変数の設定の例

課題17(1) では、シェル変数を使って短い表現を行った。これを恒久的なものにするには、 ~/.bashrc に保存する。

以下の例は、ssh でよくアクセスするホストをシェル変数に登録している。

$ cat ~/.bashrc [←]
...
coins=coins.tsukuba.ac.jp
www=www.$coins
icho=icho.u.tsukuba.ac.jp
...
$ []
これを使うと、ssh が簡単になる。
$ ssh $www [←]
$ ssh $icho [←]

◆~/bin

~/.bashrcなどを設定して、~/bin を PATH環境変数に含まれ るようにすることを奨める。自分で作成したプログラムやシェル・スクリプトを ~/bin に置くと、ファイル名を指定しなくても (「~/ファイル名」や 「./ファイル」打たなくて)、 ~/bin以下の短いファイル名で実行できるようになる。

coins では、標準で ~/binPATH に含まるように設定されて いるので、各自設定する必要はない。

◆shスクリプトでよく使われる機能

sh (/bin/sh) は、Bourne SHell と呼ばれる。対話的な利用では、csh や bash を使う人でも、シェル・スクリプトを作成する時には、sh を使う人も多 い。

実際には、Unix オリジナルの sh ではなく、bash (GNU Bourne-Again SHell) という高機能のプログラムが広く使われている。bash が sh という名前で実行 された時に sh のごとく振舞う。多くの sh の機能は、bash ではそのまま利用 できる。

■エイリアス(alias)

エイリアスとは一般に「別名」の意味。1つのものに2つ以上の名前をつける。

目的

◆bashのエイリアス

bash では、コマンドに別の名前をつける。長いコマンドラインを楽に打ち込む ため機能。 MacOS のファイルに対する alias とは別の話。

◆aliasにするかシェル・スクリプトにするか

alias とシェル・スクリプトには共通点が大きい。 aliasの代わりに、関数を使う方法もある。 The Unix Super Text 40.15.5 参照

◆aliasの例:cd ~/public_html

cd ~/public_html」を簡単に実行するためのコマンド 「cd-web」 を alias として定義する。
$ cd-web [←]
-bash: cd-web: command not found
          # 最初は cd-web というコマンドは見つからない
$ alias cd-web [←]
-bash: alias: cd-web: not found
          # 最初は cd-web という alias も見つからない
$ alias cd-web='cd ~/public_html' [←]
          # aliasの定義
$ alias cd-web [←]
alias cd-web='cd ~/public_html'
          # aliasの定義の確認
$ pwd [←]
/home/prof/yas
          # 最初はホーム・ディレクトリに居る
$ cd-web [←]
          # 定義したaliasの実行
$ pwd [←]
/home/prof/yas/public_html
          # ~/public_html に移動している。
$ []

◆~/.bashrcへの登録

bash の alias は、定義したシェルでのみ有効である。 全部のシェルで有効にするためには、 ~/.bashrc に登録する必要がある。

~/.bashrc に alias の定義を追加したものを有効にするには、次のような方法 がある。

既に実行しているシェルには反映されない。実行しているシェルに反映させる には、「.」コマンドを用いる。
$ . ~/.bashrc [←]
$ []

■実習

実習時間中には、以下の課題をできるだけ多く行いなさい。全部を行う必要は ない。

★練習問題(1901) ~/.bashrcの観察

自分のホーム・ディレクトリにある ~/.bashrc の内容を観察しなさい。
 $ cat ~/.bashrc[←]
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below
 $ []

★練習問題(1902) 1行からなるシェル・スクリプトの作成

次の手順で 1 行からなるシェル・スクリプトを作成しなさい。

まず、端末で何かコマンドを実行しなさい。以下の例では、 /Applications/Calculator.app を実行している。

$ open /Applications/Calculator.app  [←]
(^p で1行もどす。^a で、行頭に移動して 「echo '」と打ち、^e して
「' >  run-calc」 と打つ)
$ echo 'open /Applications/Calculator.app'  > run-calc [←]
$ cat run-calc  [←]
open /Applications/Calculator.app
$ []
bash の機能で、^p (Control+P) で1行戻して、echo でファイルに落とす。 echo には、実行したコマンドを 「'シングルクォート'」で括る( '|') などして、エスケープして与えると安全である。

作成したファイルは、そのまま実行できる。

$ bash run-calc  [←]

いちいち bash と打たないでもいいようにするために、chmod コマンド で実行可能属性をつける。

$ ls -l run-calc  [←]
-rw-r--r--  1 yas  prof  34  6 16 15:08 run-calc
$ chmod +x run-calc  [←]
$ ls -l run-calc  [←]
-rwxr-xr-x  1 yas  prof  34  6 16 15:08 run-calc
$ ./run-calc  [←]
$ ~/run-calc [←]
$ []
エディタ(Emacs)で1行目に「#!/bin/bash」か「#!/bin/sh」を入れる。
#!/bin/bash
open /Applications/Calculator.app 

完成したコマンドを ~/bin に移動する。

$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-calc ~/bin [←]
$ run-calc [←]
$ []

★練習問題(1903) historyからのシェル・スクリプトの作成

複数行からなるシェル・スクリプトを作成しなさい。この場合、シェルにおけ る対話を保存するために echo コマンドではなく、history コ マンドを使う。
$ open /Applications/Firefox.app [←]
$ open /Applications/Emacs.app [←]
$ history [←]
(ヒストリの表示して、何行必要か数える。
history コマンド自身の分、1行多く保存する。)
$ history |tail -3 > run-fe [←]
 history |tail -3 > run-fe
$ cat run-fe [←]
  512  open /Applications/Firefox.app
  513  open /Applications/Emacs.app
  514  history |tail -3 > run-fe
$ emacs run-fe [←]
(不要な部分を削除する。1行目に #!/bin/bash と入れる。)
$ cat  run-fe [←]
#!/bin/sh
open /Applications/Firefox.app
open /Applications/Emacs.app
$ ls -l run-fe [←]
-rw-r--r--  1 yas  prof  70  6 16 15:35 run-fe
$ chmod +x run-fe [←]
$ ls -l run-fe [←]
-rwxr-xr-x  1 yas  prof  70  6 16 15:35 run-fe
$ ./run-fe [←]
$ ~/run-fe [←]
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-fe ~/bin [←]
$ run-fe [←]
$ []

★練習問題(1904) シェル・スクリプトの例

/usr/bin には、C 言語で記述したソース・プログラムをコンパイルして作成し たプログラムの他に、シェル・スクリプト(主に/bin/sh)も含まれている。どの ようなシェル・スクリプトがあるかを調べなさい。
$ cd /usr/bin [←]
$ file * | grep shell [←]
$ []

そのプログラムが、一般のプログラム(機械語)かシェル・スクリプトかは、 file コマンドを使うと調べることができる。

 $ cd /usr/bin[←]
 $ ls -l apropos[←]
 -r-xr-xr-x  1 root  wheel  1808  5 19  2009 apropos
 $ file apropos[←]
 apropos: POSIX shell script text executable
 $ head apropos[←]
 #!/bin/sh
 #
 # apropos -- search the whatis database for keywords.
 # whatis  -- idem, but match only commands (as whole words).
 #
 # Copyright (c) 1990, 1991, John W. Eaton.
 # Copyright (c) 1994-1999, Andries E. Brouwer.
 #
 # You may distribute under the terms of the GNU General Public
 # License as specified in the README file that comes with the man
 $ []

★練習問題(1905) 制御構造

The Unix Super Text 40.15 参照。 次の機能を確認しなさい。

★練習問題(1906) bash算術計算

bash では $(()) で簡単な計算ができる。 この機能を確認しなさい。 The Unix Super Text 41.3.8項 参照
$ cat add [←]
#!/bin/bash

a=$1
b=$2
x=$(($a + $b))
echo $x
$ ./add 10 20 [←]
30
$ []

★練習問題(1907) sort

sort コマンド は、データを並べ替えるプログラムである。データは、引数で指 定されたファイル、または、標準入力から受け取る。結果は、標準出力、また は、-o で指定されたファイルに書き出すプログラムである。

1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。

$ emacs fruits.txt [←]
$ sort  fruits.txt [←]
$ sort < fruits.txt [←]

ls -l の結果は、ファイル名の順番でソートされている。これをファイルの大 きさでソートしなさい。

$ ls -l | sort -k 5 [←]

sort コマンドでよく使うオプション

-n
数値として比較
-r
逆順でソート
-f
大文字小文字を区別しない
-k 番号
番号で指定されたフィールド以降をソートする。
-o filename
結果を filename に保存

★練習問題(1908) コマンド単体の復習

今日の課題では、シェル・スクリプトを作成するために今まで利用したコマンド を利用する。 次のようなコマンドの使い方を復習しなさい。

★練習問題(1909) フィルタ

Unix でフィルタとは、標準入力から入力したデータを加工して、結果を標準出 力へ出力するようなプログラムを意味する。 The Unix Super Text 35章 参照

フィルタを利用したシェル・スクリプトを作成してみさない。

★練習問題(1910) ディレクトリの属性を表示するls -l

ls -l にディレクトリ名を与えるとその内容が表示される。-d オプションを付 けると、ディレクトリ自身の属性が表示されるが、しばしばこのオプションを 忘れてしまう。そこで、次のようなシェル・スクリプト lldir を作成して、ディ レクトリの属性を簡単に表示するようにしなさい。
$ lldir ~ [←]
drwxr-xr-x  59 yas  prof  12288  6 16 15:37 /home/prof/yas
$ lldir / [←]
drwxrwxr-t  27 root  admin  1326  4 22 15:43 /
$ []

★練習問題(1911) 数字だけを表示するdate

date は、日本語の環境では「年月日」などを含めて表示する。これを数字だけを表 示するようなシェル・スクリプト date-num を作成しなさい。
$ date [←]
2012年 6月20日 水曜日 18時04分34秒 JST
$ date-num [←]
2012-06-20
$ []
ヒント: man date で + と format string を使う。

★練習問題(1912) 世界の都市の時刻を表示するdate

自分が関心がある世界の2つ以上の都市を選びなさい。それらの都市の現在時刻 を表示するシェル・スクリプトを作成しなさい。
$ date-cities [←]
Tokyo
2012年 6月21日 木曜日 17時09分35秒 JST
New York
2012年 6月21日 木曜日 04時09分35秒 EDT
London
2012年 6月21日 木曜日 09時09分35秒 BST
$ []
ヒント: 都市の情報は、/usr/share/zoneinfo/ にある。 夏時間(daylight saving time/summer time)により、 経度の標準からずれていることもある。

★練習問題(1913) platexを2回実行するシェル・スクリプト

platx コマンドは、参照を解決するためにしばしば2 回実行する必要がある。 それを簡単にするためのシェル・スクリプト l2 を作成しなさい。
$ l2 file.tex [←]

★練習問題(1914) 条件付きでplatexを2回実行する

練習問題(1913) で、 1回目の実行でエラーが出た時には、2回目は実行しないようにしなさい。

ヒント: if を使う。 「&&」を使う方法もある。

★練習問題(1915) platex、dvipdfmx、Preview.appの連続実行

platex コマンド、dvipdfmx コマンド、Preview.app (プレビュー.app) を次々と実行するシェル・スクリプトを作成しなさい。

$ lpshow file.tex [←]
(画面には、file.pdf が Preview.app で表示される)
ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、標準では Preview.app が動作するが、他のプログラム(例えば Adobe Reader)にも変更で きる。この課題でも他のプログラムを使ってもよい。

★練習問題(1916) 条件付きでのplatex、dvipdfmx、Preview.appの連続実行

練習問題(1915) で、前のプログラムの 実行でエラーが出た時には、次のプログラムは実行しないようにしなさい。

★練習問題(1917) C言語のソース・プログラムだけを表示するls

与えられたディレクトリのC言語のソース・プログラムだけを表示するシェル・ スクリプトを作りなさい。
$ ls-c ~/syspro/file/ [←]
fd-print.c
file-copy.c
mmap-head.c
stdio-thru.c
utmp-print.c
wtmp-last10.c
ystat.c
ystat.h
ヒント:シェルの ファイル名置換 で *.c や *.h といったファイル名のものだけを取り出す。

余裕があれば、-l などのオプションが付けられるようにしなさい。

★練習問題(1918) 「.」から始まるファイルだけを表示するls

ls コマンドや bash の * では、「.」から始まるファイルは表示されない。逆 に「.」から始まるファイルだけを表示する ls コマンドを作りなさい。
$ ls-dot ~ [←]
.
..
.bashrc
.emacs
.login
$ []
ヒント

方法1:シェルの ファイル名置換 「.*」というパタンで探す。

方法2: ls に -a オプションを付けると、全てのファイルを表示し、 そのうち、先頭が「.」のものを抜き出す。 先頭が「.」のものを抜き出すには、 grep コマンドで次のパタンを検索する。

$ grep '^\.' [←]
abc[←]
.abc[←]
.abc
aaa[←]
.aaa[←]
.aaa
^D
$ []

余裕があれば、-l などのオプションが付けられるようにしなさい。

★練習問題(1919) ディレクトリだけを表示するls

ディレクトリだけを表示する ls コマンドを作りなさい。
$ lsd ~ [←]
Desktop/
Documents/
Downloads/
Library/
Mail/
Maildir/
Movies/
Music/
Pictures/
WinFiles/
bin/
public_html/
$ []
方法1: ls -F の結果を grep で必要なものだけを抜き出す。

方法2:

余裕があれば、-l などのオプションが付けられるようにしなさい。 余裕があれば、ls と同じように、ファイル名の順に並べ替えなさい。

★練習問題(1920) ファイルの大きさの順に表示するls

ls -l は、ファイルの名前の順に表示する。これを、ファイルの大きさの順に 表示するシェル・スクリプトを作りなさい。
$ ls-size ~yas/syspro/www [←]
-rwxr-xr-x   1 yas  prof  27056 Jun 12 11:54 cgi-printarg.cgi
-rwxr-xr-x   1 yas  prof  18376 Jun 19 01:29 cgi-hello.cgi
-rw-r--r--   1 yas  prof   5287 Jun 12 11:54 cgi-printarg.c
-rw-r--r--   1 yas  prof   1579 Sep 26  2002 get.c
-rwxr-xr-x   1 yas  prof    985 May 20 17:17 cgi-printarg-ruby.cgi
-rw-r--r--   1 yas  prof    486 Jun 11 21:20 cgi-hello.c
-rw-r--r--   1 yas  prof    297 Sep 22  2003 Makefile
drwxr-xr-x   5 yas  prof    170 Jun 19 01:27 CVS
-rw-r--r--   1 yas  prof     54 Feb 14  2004 data
total 128
$ []
ヒント:ls -l の出力を sort コマンドでソートする。 ソートは、第5フィールドで行う。

★練習問題(1921) ファイルの行数の順に表示するwc

wc コマンド は、ファイルの行数、単語数、バイト数を表示する。wc コマンド は、引数で与えられた順に表示する。これを行数の順に表示するようなスクリ プトを作りなさい。
$ wc-lines *.c [←]
      85     228    1836 proc-uid-print.c
      75     187    1156 pipe-rw-dup.c
      50     152    1141 vaddr-print.c
      46     140    1071 proc-create.c
      67     161    1014 pipe-rw-nodup.c
      38      93     819 signal-int.c
      50      98     802 setjmp-longjmp.c
      32      90     561 run-n.c
      27      66     535 home-print.c
      20      50     424 cont-1.c
      20      50     424 cont-0.c
      25      60     419 t-system.c
      20      40     384 exec-date.c
      14      49     370 arg-print.c
      15      44     355 env-print.c
      12      32     305 cont-2.c
      13      16     174 fork-hello.c
       4      10      60 main-return.c
$ []
この課題では、合計(Total)は表示されなくてもよい。

ヒント:wc の出力を sort コマンドでソートする。for で1つずつ wc コマン ドを実行して、全体の結果を sort するか、引数 $* で wc した後、sort する。

★練習問題(1922) 使っているメモリのサイズが大きいプロセスの表示

ps aux では、全プロセス(a)が、サイズなどの情報も含めて(u)表示される。
$ ps aux [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root         1   0.0  0.0  2456708   1356   ??  Ss   火08AM    1:26.40 /sbin/la
yas       3549   0.0  0.0  2435468    980 s000  Ss    3:40PM   0:00.01 -bash
yas       3548   0.0  0.0  2450900    748   ??  S     3:40PM   0:00.00 /usr/sbi
yas       3546   0.0  0.0  2456124    672   ??  Ss    3:40PM   0:00.01 /sbin/la
root      3544   0.0  0.1  2450900   4700   ??  S     3:40PM   0:00.27 /usr/sbi
root      3543   0.0  0.0  2446148    820   ??  Ss    3:40PM   0:00.00 /usr/lib
...
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/lib
root      3556   0.0  0.0  2434788    428 s000  R+    3:40PM   0:00.00 ps aux
$ []
そのうち、メモリのサイズ(RSS)が大きいプロセスを 10 個だけ表示するシェル・ スクリプトを作りなさい。
$ ps-rss-top10 [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root       318   0.0  3.0   215076 127388   ??  Ss   火08AM    1:12.05 /Library/
root       104   0.0  0.9  2567852  37332   ??  Ss   火08AM    0:41.42 /System/L
_windowserver  1007   0.0  0.6  2775984  25560   ??  Ss   火05PM    0:31.43 /Sys
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/libe
root      1599   0.0  0.6 11156056  24040   ??  Ss   水02PM    0:09.13 /System/L
_mysql     218   0.0  0.5  2510832  18940   ??  S    火08AM    0:57.74 /opt/loca
_securityagent  1019   0.3  0.4  2757796  15396   ??  S    火05PM    7:51.89 /Sy
root       305   0.0  0.3   152008  14292   ??  S    火08AM    0:31.75 /Library/
root      1010   0.0  0.2  2727284   7956   ??  Ss   火05PM    0:03.56 /System/L
root      1050   0.0  0.2  2777952   7676   ??  Ss   火05PM    0:00.66 /System/L
$ []
ヒント:1行目は、そのまま表示する。RSS の順(第6フィールド)に sort して head する。

余裕があれば、VSZ の順、CPU 時間の順に表示するスクリプトを作りなさい。

類似のことを実行するプログラムとして top がある。

★練習問題(1923) バックアップ・ファイルとのdiff

emacs は、ファイルを保存する時に、1つの前のバージョンを「~」を 付けて保存する。そのようなファイルを見つけて、オリジナルのファイルと diff コマンドで比較するようなスクリプトを作りなさい。
$ diff-backup kadai10.txt [←]
余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停 止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ い。

★練習問題(1924) バックアップ・ファイルとのdiff(複数ファイル)

練習問題(1923) で複数のファイルを引数に取れるよう にしなさい。
$ diff-backup kadai10.txt kadai11.txt kadai12.txt [←]
ヒント:for 文で、引数のファイルについて、"$file"~ のような名前のファイ ルが存在するかを調べる。存在すれば、diff コマンドで表示する。

★練習問題(1925) 小文字のファイル名への変更

Windows 系のコンピュータから Unix へファイルをコピーすると大文字のファ イル名になってしまうことがある。そのようなファイル名を全て小文字にする ようなスクリプトを書きなさい。

% mv-lower [A-Z]* [←]

ヒント:ファイル名を echo して、tr で小文字にして、それを `` でシェル変数に入れる。元の名前から小文字 の名前に mv で変える。

余裕があれば、大文字と小文字を変換することで、ファイルが上書きされる時 には警告を出したり、ユーザに問い合わせたりするようにしなさい。

★練習問題(1926) ファイルのn行目からm行目までの表示

引数として2つの数 n, m 、および、ファイル名を取り、そのファイルの n 行めから m 行目までを表示するシェル・スクリプトを作りなさい。 たとえば、次の例では、ファイルの 10 行目から 20 行目までを表示する。
$ show-n-m 10 20 filename [←]

余裕があれば、-n オプションを付けなさい。これは、ファイルに行番号を振 るものである。nl コマンドを使うとよい。(cat -n が使えるシステムもある。)

★練習問題(1927) カウント・ダウン

秒単位でカウント・ダウンをするようなシェル・スクリプトを作りなさい。
$ countdown 5 [←]
5
4
3
2
1
0
$ []
ヒント:sleep 1 で、1秒ごとに止める。

★練習問題(1928) coins標準の bashrc の観察

自分のホーム・ディレクトリにある ~/.bashrc は、coins 標準のbashrc を source コマンドで読み込んでいる。その読み込んでいる先のファイルで どのような設定がなされているかを観察しなさい。
$ lv ~/.bashrc [←]
$ lv /usr/local/lib/standard/bashrc [←]
環境変数 PATHの値を観察しなさい。
$ echo $PATH [←]
環境変数 PATH に含まれているディレクトリには、どのようなコマンドがある かを調べなさい。例えば、/usr/local/bin を調べるには、次のようにする。
$ ls /usr/local/bin [←]
PATH 以外にどのような シェル変数と環境変数 が設定されているかを調べなさい。

★練習問題(1929) エイリアス ll の定義

以下の例を真似て、bash の alias 機能を用いてls -l の代わりに ll というコマンドを使えるようにしなさい。

$ ls -l [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ ll [←]
-bash: ll: command not found
          # この時点ではコマンドは見つからない
$ alias ll='ls -l' [←]
          # alias による ll コマンドの定義
$ ll [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ []

★練習問題(1930) bash alias 関連のコマンド

bash の alias 関連のコマンドを利用してみなさい。
一覧表示
alias コマンドを引数なしで実行する。例:
$ alias [←]
単独表示
alias コマンドに名前を引数として与える。例:
$ alias ll [←]
定義
alias コマンドに「名前='定義内容'」 を引数として与える。例:
$ alias ll='ls -l' [←]
削除
unalias コマンドに名前を引数として与える。例:
$ unalias ll [←]

★練習問題(1931) bashのエイリアスの~/.bashrcへの登録

bash の alias は、定義したシェルでのみ有効である。 全部のシェルで有効にするためには、 ~/.bashrc に登録する必要がある。

注意: ~/.bashrc ファイルを編集することは、慎重に行うこと。それにエラー が含まれていると、iTerm のウインドウが開かなくなる(bashがすぐに終了して しまう)等の問題が生じる。

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。

 $ cat ~/.bashrc
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below

 alias ll='ls -l'
          # ~/.bashrc に ll を追加した
 $ ll[←]
 bash: ll: command not found
          # 追加しただけでは、コマンドは見つからない
 $ . ~/.bashrc[←]
          # 「.」コマンドで、~/.bashrc を読み込む
 $ ll
 (ls -l の表示)
          # ll コマンドが有効になっている。
 $ []

★練習問題(1932) 1行からなるエイリアスの定義

1行からなるシェル・スクリプトと同様に、1行からなるエイリアスを定義しなさい。

★練習問題(1933) LANGを変更するalias

環境変数LANGを次のものに変更するようなalias を定義しなさい。

★練習問題(1934) bashの関数

bash の関数を利用してみなさい。 The Unix Super Text 40.15.5 参照

★練習問題(1935) ~/.bashrcでのシェル変数の登録

シェルに対してよく打ち込む表現を、~/.bashrc で シェル変数に設定 してみなさい。

★練習問題(1936) ジョブ制御

The Unix Super Text 22.3節 参照

次の機能を確認しなさい。

■課題19 シェル・スクリプト

以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

(1) 練習問題(1910) から 練習問題(1927) まで から2つ選んでシェル・スクリプトを作成しなさい。 作成したシェル・スクリプトを、ディレクトリ ~/bin に起きなさい。 作成したシェル・スクリプトについて、次のことを書きなさい。

(2) The Unix Super Text の次の部分を読みなさい。 次の項目について簡単に説明しなさい。

(3) [加点] ~/.bashrc に対してエイリアス、シェル変数、または関数を定義し て追加しなさい。次のことを書きなさい。

ただし、エイリアスとしては aliasの例:cd ~/public_html練習問題(1931) で示した ll 以外の、 新しいものを定義しなさい。 シェル変数としては、 ~/.bashrcでのシェル変数の設定の例 で示した $coins, $www, $icho 以外の、新しいものを定義しなさい。

注意: ~/.bashrc ファイルを編集することは、慎重に行うこと。それにエラー が含まれていると、iTerm のウインドウが開かなくなる(bashがすぐに終了して しまう)等の問題が生じる。

(4) [加点] bash の制御構造 if, for, while, case のどれかを含むシェル・ スクリプトを作成しなさい。2つ以上含んでいてもよい。この基準を満たしてい れば、 練習問題(1910) から 練習問題(1927) まで のうちの何れかを解いてもよい。ただし、(1) とは別のシェル・スクリプトを 提出しなさい。 作成したシェル・スクリプトについて、次のことを書きなさい。


Last updated: 2012/06/20 18:45:45
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>