(演習)UNIXのシェル

目次

準備

  • 大学のサーバにログインしてLinuxを使う。ログインにはたとえば「Tera Term Pro」を使う。
  • サーバ名は x.educ.tamagawa.ac.jp である。
  • また,Cygwinというソフトを使うと、WindowsでもUNIXのシェルやコマンドが使えるようになる。

シェルコマンド

基本コマンド

  • マニュアルの閲覧
    • man
    • 以下のようにタイプして実行してみよ。
      man man
  • ディレクトリ操作
    • ls
    • pwd
    • cd
    • mkdir
    • rmdir
  • ファイル操作
    • cp
    • rm
    • mv
    • ln
    • chmod
  • プロセス操作
    • ps
    • kill

プロセス操作

psは現在稼働中のプロセスの状態を示し,killはそれを強制終了するコマンドである.

  1. サーバにログインしたウィンドウを2つ作り,片方で下記のようにタイプしなさい。
    ping www.tamagawa.ac.jp.
  2. 動き続けているpingは[Control]+[C]でとめられるが,これをもう1つのウィンドウから止めてみよう.
  3. もう一つのターミナルウィンドウから,下記のように入力しなさい。
    ps -x
  4. このなかにpingというのがあるはずなので,そのPID (プロセスID)を覚えて下さい.
  5. pingのPIDがたとえば12345なら,下記のようにタイプしてみなさい。
    kill 12345

ワイルドカード

シェルのコマンドラインでは、ファイル名を指定するときにワイルドカードが使える。 ワイルドカード「*」と「?」の意味について調べなさい。

リダイレクトとパイプ

シェルコマンドは「|」(縦棒)で接続し、前のコマンドの出力を次のコマンドの入力に流し込むことができます。 これをパイプ(パイプライン)と呼ぶ.たとえば,

ls -l | more

とするとls -lの結果を1ページずつ止めてみることが出来る.

また、リダイレクト「>」を用いると、コマンドの出力結果をファイルに書き出すことができる。たとえば,

ls > tako

とすると,lsの結果をtakoというファイルに書き込んでくれる。 逆に「<」を用いると、ファイルの内容をコマンドの入力にすることもできる。

シェルスクリプト

シェルスクリプトとは?

シェルにおける一連のコマンド操作をプログラムとしてファイルに記録しておき、あとで再現する(実行させる)ことができる。 たとえば、以下のような手順でシェルスクリプトを作成する。

  1. テキストエディタで、以下の内容のファイルを作成する。
    #! /bin/sh
    echo "---start---"
    ps -aux | grep X
    echo "----end---"
  2. このファイルを、psxという名前で保存する。
  3. 次のようにタイプして、psxを実行可能にする。
    chmod 755 psx
  4. psxを実行する。何が起こるか?
    ./psx

つまり、以上のようにすると、コマンドラインで「./psx」と打つことで、「ps -aux | grep X」と打ったのと同じ効果が得られる。このように、シェルでよく行う手順をあらかじめ記録しておくのがシェルスクリプトである。

なお、1行目の「#! /bin/sh」はシェルスクリプトを実行するシェルを指定するもので、必ずこのように書くこと。

シェル変数

シェルスクリプトの中では(中でなくても)、変数を使うことができる。

  • 変数への代入は、「変数名=値」とする。
  • 変数の値の参照は、頭にドルマークをつけて「$変数名」とする。
  • 下記はシェルスクリプトの例。
    #! /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

制御構造

シェルスクリプトの中では、各種制御構造が使える。

  • 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

演習課題

【問1】 下記のコマンドの役割を調べ,それぞれ1つ以上の使用例を示しなさい。

  1. ls
  2. pwd
  3. cd
  4. mkdir
  5. rmdir
  6. cp
  7. rm
  8. mv
  9. ln
  10. chmod
  11. cat
  12. head
  13. sort
  14. grep
  15. find
  16. who
  17. passwd
  18. ps
  19. kill
  20. history

【問2】 以下のコマンドが、それぞれ何をしているのか調べなさい。不明なコマンドはmanコマンドなどで調べること。

  1. echo Hello! > hello.txt
  2. ps -ef | more
  3. ps -ef | grep root > ps-root.txt
  4. find /etc -name "*tab" -print
  5. cat *.txt > goodbye.txt

【問3】 以下のような操作を実現するシェルコマンドを示しなさい。

  1. ホームディレクトリの下に、「os2006」というディレクトリを作成するシェルコマンド。
  2. 現在コンピュータで動いているプロセスの一覧を、ユーザ名の順番で並べ替えるシェルコマンド。1画面ごとに表示させるのが好ましい。
  3. ディレクトリ「/usr/man」とそのサブディレクトリの中から、「g」で始まるファイルをすべて探し出して列挙するシェルコマンド。数が多い場合には、1画面ごとに表示させるのが好ましい。
  4. コマンド「du」を用いると、指定したディレクトリとそのサブディレクトリのディスクの使用量が分かる。「du」の出力を大きい順に並べ替えるシェルコマンドを示しなさい。これも、1画面ごとに表示させるのが好ましい。
    • du の使用例
      du /usr/lib

発展課題

【問4】 以下のような動作をするシェルスクリプトを作成しなさい。

以下のような手順を実現するシェルスクリプトを作成しなさい。

  1. 画面に「Hello!」と表示するシェルスクリプト。
    • 実行例
      $ ./hello        ← たとえば hello という名前のシェルスクリプトにした。 
      Hello!   ← 実行結果。
    • ヒント: echo
  2. コマンド引数で指定したディレクトリに、C言語のソースファイルがあるか調べるシェルスクリプト。
    • 実行例
      $ ./findc prog  ← prog というディレクトリを調べる。
      prog/test1.c    ← 実行結果。見付かったファイルが列挙される。
      prog/test2.c
      prog/test3.c
    • ヒント: find, 引数の取り出し($1)
  3. キーボードからの入力を求め、それが「L」だったら「LEFT」、「R」だったら「RIGHT」と表示するシェルスクリプト。
    • 実行例
      $ ./asklr       ← シェルスクリプトの実行。
      Input L or R ?  ← 「L」か「R」を入力するように要求してくる。
      R               ← ユーザが「R」と入力。
      RIGHT           ← 結果表示。
    • ヒント: read, if
  4. コマンドの引数で与えられた複数の文字列をたてに表示するシェルスクリプト。
    • 実行例
      $ ./vecho yamada takeuchi nakamura shiozawa gogo!
      yamada
      takeuchi
      nakamura
      shiozawa
      gogo!
    • ヒント: for, 引数の取り出し($*)

【問5】 以下のような動作をするシェルスクリプトを作成しなさい。

  1. コマンド引数で与えられたファイルを、誰からも読めなくするシェルスクリプト。
    • 実行例
      $ ./secret himitsu.txt
  2. C言語のソースファイル(拡張子が .c のファイル)を全部つなげて、1つの大きなテキストファイルにするシェルスクリプト。
    • 実行例(リダイレクト(>)が不要にしてもよい)
      $ ./cmerge > cfiles.txt
  3. 「Hello!」と表示するシェルスクリプトを改良して、自分のホスト名(コンピュータ名)を表示するシェルスクリプト。
    • 実行例
      $ ./hi
      Hi! My name is a01.cad.eng.tamagawa.ac.jp.
  4. ユーザが「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」と入力すると終了する。
  5. コマンドラインで指定した月(複数)のカレンダを表示するシェルスクリプト。
    • 実行例
      $ ./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

参考資料

以上


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-11-09 (木) 10:22:20 (5501d)