OS/2006-F07
の編集
https://vilab.org/lecture/?OS/2006-F07
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
* (演習)UNIXのシェル [#hb749fbd] ** 目次 [#o7632a21] #contents ** 準備 [#nbe7f5e4] - 大学のサーバにログインしてLinuxを使う。ログインにはたとえば「Tera Term Pro」を使う。 -サーバ名は x.educ.tamagawa.ac.jp である。 - また,Cygwinというソフトを使うと、WindowsでもUNIXのシェルやコマンドが使えるようになる。 -- http://www.cygwin.com -- http://www.sixnine.net/cygwin/ ** シェルコマンド [#id51bb33] *** 基本コマンド [#u3cb41b7] - マニュアルの閲覧 -- man -- 以下のようにタイプして実行してみよ。 man man - ディレクトリ操作 -- ls -- pwd -- cd -- mkdir -- rmdir - ファイル操作 -- cp -- rm -- mv -- ln -- chmod - プロセス操作 -- ps -- kill *** プロセス操作 [#m082a650] psは現在稼働中のプロセスの状態を示し,killはそれを強制終了するコマンドである. + サーバにログインしたウィンドウを2つ作り,片方で下記のようにタイプしなさい。 ping www.tamagawa.ac.jp. + 動き続けているpingは[Control]+[C]でとめられるが,これをもう1つのウィンドウから止めてみよう. + もう一つのターミナルウィンドウから,下記のように入力しなさい。 ps -x + このなかにpingというのがあるはずなので,そのPID (プロセスID)を覚えて下さい. + pingのPIDがたとえば12345なら,下記のようにタイプしてみなさい。 kill 12345 *** ワイルドカード [#k7155502] シェルのコマンドラインでは、ファイル名を指定するときにワイルドカードが使える。 ワイルドカード「*」と「?」の意味について調べなさい。 *** リダイレクトとパイプ [#c49409a9] シェルコマンドは「|」(縦棒)で接続し、前のコマンドの出力を次のコマンドの入力に流し込むことができます。 これをパイプ(パイプライン)と呼ぶ.たとえば, ls -l | more とするとls -lの結果を1ページずつ止めてみることが出来る. また、リダイレクト「>」を用いると、コマンドの出力結果をファイルに書き出すことができる。たとえば, ls > tako とすると,lsの結果をtakoというファイルに書き込んでくれる。 逆に「<」を用いると、ファイルの内容をコマンドの入力にすることもできる。 ** シェルスクリプト [#wc18894a] *** シェルスクリプトとは? [#b444b564] シェルにおける一連のコマンド操作をプログラムとしてファイルに記録しておき、あとで再現する(実行させる)ことができる。 たとえば、以下のような手順でシェルスクリプトを作成する。 + テキストエディタで、以下の内容のファイルを作成する。 #! /bin/sh echo "---start---" ps -aux | grep X echo "----end---" + このファイルを、psxという名前で保存する。 + 次のようにタイプして、psxを実行可能にする。 chmod 755 psx + psxを実行する。何が起こるか? ./psx つまり、以上のようにすると、コマンドラインで「./psx」と打つことで、「ps -aux | grep X」と打ったのと同じ効果が得られる。このように、シェルでよく行う手順をあらかじめ記録しておくのがシェルスクリプトである。 なお、1行目の「#! /bin/sh」はシェルスクリプトを実行するシェルを指定するもので、必ずこのように書くこと。 *** シェル変数 [#dcce2ab8] シェルスクリプトの中では(中でなくても)、変数を使うことができる。 - 変数への代入は、「変数名=値」とする。 - 変数の値の参照は、頭にドルマークをつけて「$変数名」とする。 - 下記はシェルスクリプトの例。 #! /bin/sh msg="This is a pen." echo $msg - コマンドライン引数は、「$*」という特殊な変数で得られる。 #! /bin/sh echo $* - コマンドライン引数を1ずつ取り出したいときには、「$1」「$2」…などという表記を用いる。 #! /bin/sh echo $3 $2 $1 - キーボードから文字列を読み込むには、readというコマンドを用いる。 #! /bin/sh read str echo $str - コマンドの実行結果を変数に代入するには、「`」(バッククオート)を用いる。 #! /bin/sh lsout=`ls -la` echo $lsout *** 制御構造 [#e5514378] シェルスクリプトの中では、各種制御構造が使える。 - if if 条件文 then 条件文と一致した場合の処理 fi if 条件文 then 条件文と一致した場合の処理 else 条件文と一致しなかった場合の処理 fi -- 実際にはifは、たいてい [ ] というコマンドと一緒に使う。以下はシェルスクリプトの例。 #! /bin/sh read key if [ "$key" = "y" ] then echo "YES!" else echo "NO!" fi -- コマンド [ ] の詳しい説明は、「man test」で調べることができる。 - while while 条件文 do 条件文と一致した時の処理 done -- シェルスクリプトの例。 #! /bin/sh key="y" while [ "$key" = "y" ] do echo -n "continue? (y/n) " read key done echo "end." - for for 変数 in リスト do リストの項目を1つずつ変数に代入して処理 done -- シェルスクリプトの例。 #! /bin/sh for i in 1 2 3 4 5 6 7 8 9 10 do echo $i done - case case 文字列 in パターン1) パターン1に一致した時の処理 ;; パターン2) パターン2に一致した時の処理 ;; esac ** 演習課題 [#v503dff0] 【問1】 下記のコマンドの役割を調べ,それぞれ1つ以上の使用例を示しなさい。 + ls + pwd + cd + mkdir + rmdir + cp + rm + mv + ln + chmod + cat + head + sort + grep + find + who + passwd + ps + kill + history 【問2】 以下のコマンドが、それぞれ何をしているのか調べなさい。不明なコマンドはmanコマンドなどで調べること。 + echo Hello! > hello.txt + ps -ef | more + ps -ef | grep root > ps-root.txt + find /etc -name "*tab" -print + cat *.txt > goodbye.txt 【問3】 以下のような操作を実現するシェルコマンドを示しなさい。 + ホームディレクトリの下に、「os2006」というディレクトリを作成するシェルコマンド。 + 現在コンピュータで動いているプロセスの一覧を、ユーザ名の順番で並べ替えるシェルコマンド。1画面ごとに表示させるのが好ましい。 + ディレクトリ「/usr/man」とそのサブディレクトリの中から、「g」で始まるファイルをすべて探し出して列挙するシェルコマンド。数が多い場合には、1画面ごとに表示させるのが好ましい。 + コマンド「du」を用いると、指定したディレクトリとそのサブディレクトリのディスクの使用量が分かる。「du」の出力を大きい順に並べ替えるシェルコマンドを示しなさい。これも、1画面ごとに表示させるのが好ましい。 -- du の使用例 du /usr/lib ** 発展課題 [#c5c7c96e] 【問4】 以下のような動作をするシェルスクリプトを作成しなさい。 以下のような手順を実現するシェルスクリプトを作成しなさい。 + 画面に「Hello!」と表示するシェルスクリプト。 -- 実行例 $ ./hello ← たとえば hello という名前のシェルスクリプトにした。 Hello! ← 実行結果。 -- ヒント: echo + コマンド引数で指定したディレクトリに、C言語のソースファイルがあるか調べるシェルスクリプト。 -- 実行例 $ ./findc prog ← prog というディレクトリを調べる。 prog/test1.c ← 実行結果。見付かったファイルが列挙される。 prog/test2.c prog/test3.c -- ヒント: find, 引数の取り出し($1) + キーボードからの入力を求め、それが「L」だったら「LEFT」、「R」だったら「RIGHT」と表示するシェルスクリプト。 -- 実行例 $ ./asklr ← シェルスクリプトの実行。 Input L or R ? ← 「L」か「R」を入力するように要求してくる。 R ← ユーザが「R」と入力。 RIGHT ← 結果表示。 -- ヒント: read, if + コマンドの引数で与えられた複数の文字列をたてに表示するシェルスクリプト。 -- 実行例 $ ./vecho yamada takeuchi nakamura shiozawa gogo! yamada takeuchi nakamura shiozawa gogo! -- ヒント: for, 引数の取り出し($*) 【問5】 以下のような動作をするシェルスクリプトを作成しなさい。 + コマンド引数で与えられたファイルを、誰からも読めなくするシェルスクリプト。 -- 実行例 $ ./secret himitsu.txt + C言語のソースファイル(拡張子が .c のファイル)を全部つなげて、1つの大きなテキストファイルにするシェルスクリプト。 -- 実行例(リダイレクト(>)が不要にしてもよい) $ ./cmerge > cfiles.txt + 「Hello!」と表示するシェルスクリプトを改良して、自分のホスト名(コンピュータ名)を表示するシェルスクリプト。 -- 実行例 $ ./hi Hi! My name is a01.cad.eng.tamagawa.ac.jp. + ユーザが「stop」と入力するまで、時刻を表示し続けるシェルスクリプト。 -- 実行例 $ ./dateloop ← シェルスクリプトを起動すると、 2005年 5月 11日 水曜日 11:44:01 JST ← 時刻を表示して入力待ちになる。 ← ただ [Enter] を押したり、 2005年 5月 11日 水曜日 11:44:05 JST aaaa ← 適当な文字や、 2005年 5月 11日 水曜日 11:44:36 JST 123 ← 適当な数字を入れると続行する。 2005年 5月 11日 水曜日 11:44:40 JST stop ← 「stop」と入力すると終了する。 + コマンドラインで指定した月(複数)のカレンダを表示するシェルスクリプト。 -- 実行例 $ ./mcal 4 5 ←コマンドの入力。4月と5月を指定。 April 2005 ←以下、結果出力。4月と5月のカレンダー。 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 May 2005 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ** 参考資料 [#r3b40a57] - http://www.tokaido.co.jp/syoko/handyman/contents.html - http://www.wakhok.ac.jp/~maruyama/Unix92/Unix92.html - http://www.mita.cc.keio.ac.jp/manual/unix/UNIX.html - http://www.ep.sci.hokudai.ac.jp/~inex/y2004/1029/jitsugi/shell.html - http://www.mlab.im.dendai.ac.jp/~tobe/xp-2/linux3.html - http://warp.syns.net/10/ - http://www.stackasterisk.jp/tech/systemManagement/bash03_01.jsp - http://www.ybi.co.jp/koike/src/BSH.htm - http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html - http://www.elect.chuo-u.ac.jp/tsuki/~tsun/lang/sh/ - http://www.ep.sci.hokudai.ac.jp/~inex/y2002/1101/1101_script.html 以上
タイムスタンプを変更しない
* (演習)UNIXのシェル [#hb749fbd] ** 目次 [#o7632a21] #contents ** 準備 [#nbe7f5e4] - 大学のサーバにログインしてLinuxを使う。ログインにはたとえば「Tera Term Pro」を使う。 -サーバ名は x.educ.tamagawa.ac.jp である。 - また,Cygwinというソフトを使うと、WindowsでもUNIXのシェルやコマンドが使えるようになる。 -- http://www.cygwin.com -- http://www.sixnine.net/cygwin/ ** シェルコマンド [#id51bb33] *** 基本コマンド [#u3cb41b7] - マニュアルの閲覧 -- man -- 以下のようにタイプして実行してみよ。 man man - ディレクトリ操作 -- ls -- pwd -- cd -- mkdir -- rmdir - ファイル操作 -- cp -- rm -- mv -- ln -- chmod - プロセス操作 -- ps -- kill *** プロセス操作 [#m082a650] psは現在稼働中のプロセスの状態を示し,killはそれを強制終了するコマンドである. + サーバにログインしたウィンドウを2つ作り,片方で下記のようにタイプしなさい。 ping www.tamagawa.ac.jp. + 動き続けているpingは[Control]+[C]でとめられるが,これをもう1つのウィンドウから止めてみよう. + もう一つのターミナルウィンドウから,下記のように入力しなさい。 ps -x + このなかにpingというのがあるはずなので,そのPID (プロセスID)を覚えて下さい. + pingのPIDがたとえば12345なら,下記のようにタイプしてみなさい。 kill 12345 *** ワイルドカード [#k7155502] シェルのコマンドラインでは、ファイル名を指定するときにワイルドカードが使える。 ワイルドカード「*」と「?」の意味について調べなさい。 *** リダイレクトとパイプ [#c49409a9] シェルコマンドは「|」(縦棒)で接続し、前のコマンドの出力を次のコマンドの入力に流し込むことができます。 これをパイプ(パイプライン)と呼ぶ.たとえば, ls -l | more とするとls -lの結果を1ページずつ止めてみることが出来る. また、リダイレクト「>」を用いると、コマンドの出力結果をファイルに書き出すことができる。たとえば, ls > tako とすると,lsの結果をtakoというファイルに書き込んでくれる。 逆に「<」を用いると、ファイルの内容をコマンドの入力にすることもできる。 ** シェルスクリプト [#wc18894a] *** シェルスクリプトとは? [#b444b564] シェルにおける一連のコマンド操作をプログラムとしてファイルに記録しておき、あとで再現する(実行させる)ことができる。 たとえば、以下のような手順でシェルスクリプトを作成する。 + テキストエディタで、以下の内容のファイルを作成する。 #! /bin/sh echo "---start---" ps -aux | grep X echo "----end---" + このファイルを、psxという名前で保存する。 + 次のようにタイプして、psxを実行可能にする。 chmod 755 psx + psxを実行する。何が起こるか? ./psx つまり、以上のようにすると、コマンドラインで「./psx」と打つことで、「ps -aux | grep X」と打ったのと同じ効果が得られる。このように、シェルでよく行う手順をあらかじめ記録しておくのがシェルスクリプトである。 なお、1行目の「#! /bin/sh」はシェルスクリプトを実行するシェルを指定するもので、必ずこのように書くこと。 *** シェル変数 [#dcce2ab8] シェルスクリプトの中では(中でなくても)、変数を使うことができる。 - 変数への代入は、「変数名=値」とする。 - 変数の値の参照は、頭にドルマークをつけて「$変数名」とする。 - 下記はシェルスクリプトの例。 #! /bin/sh msg="This is a pen." echo $msg - コマンドライン引数は、「$*」という特殊な変数で得られる。 #! /bin/sh echo $* - コマンドライン引数を1ずつ取り出したいときには、「$1」「$2」…などという表記を用いる。 #! /bin/sh echo $3 $2 $1 - キーボードから文字列を読み込むには、readというコマンドを用いる。 #! /bin/sh read str echo $str - コマンドの実行結果を変数に代入するには、「`」(バッククオート)を用いる。 #! /bin/sh lsout=`ls -la` echo $lsout *** 制御構造 [#e5514378] シェルスクリプトの中では、各種制御構造が使える。 - if if 条件文 then 条件文と一致した場合の処理 fi if 条件文 then 条件文と一致した場合の処理 else 条件文と一致しなかった場合の処理 fi -- 実際にはifは、たいてい [ ] というコマンドと一緒に使う。以下はシェルスクリプトの例。 #! /bin/sh read key if [ "$key" = "y" ] then echo "YES!" else echo "NO!" fi -- コマンド [ ] の詳しい説明は、「man test」で調べることができる。 - while while 条件文 do 条件文と一致した時の処理 done -- シェルスクリプトの例。 #! /bin/sh key="y" while [ "$key" = "y" ] do echo -n "continue? (y/n) " read key done echo "end." - for for 変数 in リスト do リストの項目を1つずつ変数に代入して処理 done -- シェルスクリプトの例。 #! /bin/sh for i in 1 2 3 4 5 6 7 8 9 10 do echo $i done - case case 文字列 in パターン1) パターン1に一致した時の処理 ;; パターン2) パターン2に一致した時の処理 ;; esac ** 演習課題 [#v503dff0] 【問1】 下記のコマンドの役割を調べ,それぞれ1つ以上の使用例を示しなさい。 + ls + pwd + cd + mkdir + rmdir + cp + rm + mv + ln + chmod + cat + head + sort + grep + find + who + passwd + ps + kill + history 【問2】 以下のコマンドが、それぞれ何をしているのか調べなさい。不明なコマンドはmanコマンドなどで調べること。 + echo Hello! > hello.txt + ps -ef | more + ps -ef | grep root > ps-root.txt + find /etc -name "*tab" -print + cat *.txt > goodbye.txt 【問3】 以下のような操作を実現するシェルコマンドを示しなさい。 + ホームディレクトリの下に、「os2006」というディレクトリを作成するシェルコマンド。 + 現在コンピュータで動いているプロセスの一覧を、ユーザ名の順番で並べ替えるシェルコマンド。1画面ごとに表示させるのが好ましい。 + ディレクトリ「/usr/man」とそのサブディレクトリの中から、「g」で始まるファイルをすべて探し出して列挙するシェルコマンド。数が多い場合には、1画面ごとに表示させるのが好ましい。 + コマンド「du」を用いると、指定したディレクトリとそのサブディレクトリのディスクの使用量が分かる。「du」の出力を大きい順に並べ替えるシェルコマンドを示しなさい。これも、1画面ごとに表示させるのが好ましい。 -- du の使用例 du /usr/lib ** 発展課題 [#c5c7c96e] 【問4】 以下のような動作をするシェルスクリプトを作成しなさい。 以下のような手順を実現するシェルスクリプトを作成しなさい。 + 画面に「Hello!」と表示するシェルスクリプト。 -- 実行例 $ ./hello ← たとえば hello という名前のシェルスクリプトにした。 Hello! ← 実行結果。 -- ヒント: echo + コマンド引数で指定したディレクトリに、C言語のソースファイルがあるか調べるシェルスクリプト。 -- 実行例 $ ./findc prog ← prog というディレクトリを調べる。 prog/test1.c ← 実行結果。見付かったファイルが列挙される。 prog/test2.c prog/test3.c -- ヒント: find, 引数の取り出し($1) + キーボードからの入力を求め、それが「L」だったら「LEFT」、「R」だったら「RIGHT」と表示するシェルスクリプト。 -- 実行例 $ ./asklr ← シェルスクリプトの実行。 Input L or R ? ← 「L」か「R」を入力するように要求してくる。 R ← ユーザが「R」と入力。 RIGHT ← 結果表示。 -- ヒント: read, if + コマンドの引数で与えられた複数の文字列をたてに表示するシェルスクリプト。 -- 実行例 $ ./vecho yamada takeuchi nakamura shiozawa gogo! yamada takeuchi nakamura shiozawa gogo! -- ヒント: for, 引数の取り出し($*) 【問5】 以下のような動作をするシェルスクリプトを作成しなさい。 + コマンド引数で与えられたファイルを、誰からも読めなくするシェルスクリプト。 -- 実行例 $ ./secret himitsu.txt + C言語のソースファイル(拡張子が .c のファイル)を全部つなげて、1つの大きなテキストファイルにするシェルスクリプト。 -- 実行例(リダイレクト(>)が不要にしてもよい) $ ./cmerge > cfiles.txt + 「Hello!」と表示するシェルスクリプトを改良して、自分のホスト名(コンピュータ名)を表示するシェルスクリプト。 -- 実行例 $ ./hi Hi! My name is a01.cad.eng.tamagawa.ac.jp. + ユーザが「stop」と入力するまで、時刻を表示し続けるシェルスクリプト。 -- 実行例 $ ./dateloop ← シェルスクリプトを起動すると、 2005年 5月 11日 水曜日 11:44:01 JST ← 時刻を表示して入力待ちになる。 ← ただ [Enter] を押したり、 2005年 5月 11日 水曜日 11:44:05 JST aaaa ← 適当な文字や、 2005年 5月 11日 水曜日 11:44:36 JST 123 ← 適当な数字を入れると続行する。 2005年 5月 11日 水曜日 11:44:40 JST stop ← 「stop」と入力すると終了する。 + コマンドラインで指定した月(複数)のカレンダを表示するシェルスクリプト。 -- 実行例 $ ./mcal 4 5 ←コマンドの入力。4月と5月を指定。 April 2005 ←以下、結果出力。4月と5月のカレンダー。 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 May 2005 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ** 参考資料 [#r3b40a57] - http://www.tokaido.co.jp/syoko/handyman/contents.html - http://www.wakhok.ac.jp/~maruyama/Unix92/Unix92.html - http://www.mita.cc.keio.ac.jp/manual/unix/UNIX.html - http://www.ep.sci.hokudai.ac.jp/~inex/y2004/1029/jitsugi/shell.html - http://www.mlab.im.dendai.ac.jp/~tobe/xp-2/linux3.html - http://warp.syns.net/10/ - http://www.stackasterisk.jp/tech/systemManagement/bash03_01.jsp - http://www.ybi.co.jp/koike/src/BSH.htm - http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html - http://www.elect.chuo-u.ac.jp/tsuki/~tsun/lang/sh/ - http://www.ep.sci.hokudai.ac.jp/~inex/y2002/1101/1101_script.html 以上
テキスト整形のルールを表示する