Unix基礎2(シェル)
1.シェルとは
(1) シェル
Unixとユーザ間のインターフェイスを果たすもので、ユーザがキー入力したコマンドを読み取って解釈し実行させたり、カーネルにシステムコールを行ったりするコマンドインタプリタのこと。但しUnixではこれがシステムプログラムではなく、一種のユーザプログラムである。標準シェル(ベル研で開発、Cシェルと区別するためBシェルとも呼ばれる)とCシェル(バークレー版、標準シェルの機能を拡張)がある。
(2) シェルの機能
Ø コマンド・ユーザプログラムの実行。
Ø 入出力切り替え、ファイル割付。
Ø プロセスのパイプ処理。
Ø バックグラウンドプロセスの生成。
Ø メタキャラクタによるファイル名の指定。
Ø シェル変数とパラメータの受け渡し。
Ø コマンド実行結果の引用。
Ø 実行環境の設定、伝達。
Ø 色々なプログラム言語やソフトウェアを使える。
Ø ログイン時のスタートアップファイルの設定。
Ø シェルプロシージャ(シェルスクリプト)の実行。
(3) 入出力ファイル
Ø 標準入出力
標準入力:キーボード
標準出力:ターミナル
Ø 入出力切り替え
$date > out
$who > ../out
$who >> out
$cat < out
$cat < out > out2
(4) フィルタ
標準入力からデータを読み取り、それらに操作して、結果を標準出力に出力するコマンド。以下は代表的なもの。
Ø wc
Ø grep
Ø sort
Ø tr
Ø head
Ø tail
(5) パイプ
一つのフィルタの出力を別のフィルタの入力に用いる機能。プロセスは並列実行、但し各プロセス間の同期はシステムが行う。一次ファイルは作らず、バッファリングはメモリを使ってシステムが行う。
Ø who | wc -l (who > file1, wc -l < file1, rm file1のこと)
Ø who | tee out | wc -l
(6) プロセス
Ø プロセスとはある特定の仕事をするプログラムのこと。
Ø 実行可能ファイルを実行すると一つのプロセスになる(シェルも一つのプロセス)。
Ø Unixでは同時に複数のプロセスを実行できる。
Ø 各々のプロセスは生成された順にプロセスIDが付けられ識別される。
Ø コマンドの後に & をつけるとバックグラウンドプロセスになる。
Ø プロセスを強制終了させたいときは「BREAK」か「DEL」キーを押す。バックグラウンドの場合は、killコマンドを用いる(kill -9 プロセスID)。
Ø プロセスの状態を知るにはpsコマンドを用いる(ps -e, ps -f, ps -l, ps -d, ps -a)。
Ø 実行中にログアウトしたりハングアップしたりしても、プロセスを継続させたいときは、nohupコマンドを用いる。
Ø 1ラインでコマンドを複数実行するにはコマンドセパレータを用いる(; & && ||)。
Ø プロセスの優先順位の変更(低下のみ)はniceコマンドを用いる。nice値は大きいと優先順位は低い。
2.シェルプロシージャ
(1) シェルプロシージャとは
シェルはコマンドインタプリタの他に、以下の機能を持つ。
Ø シェル変数の設定
Ø 構造化機能
Ø パラメータの設定
Ø 割り込み機能
一般にシェルのプログラム言語は、シェルプロシージャ(シェルスクリプト)と呼ばれ、ユーザのアプリケーションツールを設計する。その手順は、
Ø エディタを用いて、いくつかのコマンドをファイルに入れておく。
Ø 実行するには、「shファイル名」と打つか、chmodで実行可能ファイルに変更してから、そのファイル名を打ち込む。
(2) 位置パラメータ
引数の順番に$1, $2, $3 … と位置パラメータを定義でき、対応する位置の引数の値がこれらの位置パラメータと置き換えられる。
Ø
aaaというファイルを作る。
echo $3 $1 $2
Ø
chmod +x aaa
Ø
aaa am fine. I
Ø
bbbというファイルを作る(shiftはシェルの内部コマンド)。
echo $1 $2 $3
shift
echo $1 $2
shift
echo $1
Ø
chmod +x bbb
Ø
bbb a b c
(3) シェル変数
良く使う文字列を変数として定義できる。これをシェル変数と呼び、英字で始まる英数字と「 _ 」を名前に使うことができる。シェル変数を値として使用するには頭に「$」をつける。
Ø name=abc
Ø echo $name
Ø name=
シェル変数を{ }で区切ることで別の変数の一部として使用できる。
Ø user=/home/*****/progA/Nov
Ø cd ${user}7
Ø cd ${user}14
未定義のシェル変数に対し、次のような置き換えができる。
Ø echo $name
Ø echo ${name:-/home/****/progA}
Ø echo $name
Ø echo ${name:=/home/****/progA}
Ø echo $name
その他シェル変数に関するコマンド
Ø set (環境変数の表示)
Ø export (子プロセスへシェルの受け渡し)
Ø readonly (読み取りのみとする)
Ø read (シェル変数を標準入力から入力する。内部コマンド。)
Ø expr (算術演算コマンド。+ - \* / %)
(4) 引用符
Ø \(バックスラッシュ):メタキャラクタをただの文字とする。
Ø ‘(シングルコーテーション):「’」を除く全ての文字を区切る。
Ø “(ダブルコーテーション):「” \ $ ‘」を除く全ての文字を区切る。
Ø `(バックコーテーション):これで囲まれたコマンドをその実行結果と置き換える。
(5) 構造化プログラミング
for文:いくつかのパラメータに同じ作用を繰り返す。
Ø cccというファイルを作る。
for i in I am fine
do
echo $i
done
Ø cat ccc
Ø chmod +x ccc
Ø ccc
case文:値のパターンによって異なる処理をする。
Ø dddというファイルを作る。
case $1 in
i) echo “I am fine.” ;;
you) echo “You are fine, too.” ;;
he) echo “He is not fine.” ;;
she) echo “She is ill.” ;;
*) echo “$1 is not found. Try again.” ;;
esac
Ø cat ddd
Ø chmod +x ddd
Ø ddd i
Ø ddd she
Ø ddd they
test文:真偽の条件判定。
Ø ファイル型の真偽判定
-f (ファイルが存在するか否か)
-s (ファイルの中身が存在するか否か)
-r (ファイルにread権があるか否か)
-w (ファイルにwrite権があるか否か)
-x (ファイルに実行権があるか否か)
-d (ファイルがディレクトリか否か)
-c
-b
Ø 文字列の真偽判定
-z s1
-n s1
s1
s1 = s2
s1! = s2
Ø 数値の真偽判定
n1 -eq n2
n1 -ne n2
n1 -ge n2
n1 -gt n2
n1 -le n2
n1 -lt n2
if文:条件判定によって処理を変える。
Ø eeeというファイルを作る。
if test -f $1
then
echo “File” $1
“exists.”
else
echo “File” $1
“does not exist.”
fi
Ø cat eee
Ø chmod +x eee
Ø eee ddd
Ø eee fff
while文:コマンドリストが真の間、do以下の処理をする。
Ø fffというファイルを作る。
number=0
sum=0
while test
$number -lt 10
do
number=` expr
$number + 1`
sum=`expr $sum +
$number `
done
echo “SUM=$sum”
Ø cat fff
Ø chmod +x fff
Ø fff
Ø gggというファイルを作る。
while true
do
date
sleep 2
done
Ø cat ggg
Ø chmod +x ggg
Ø ggg
until文:コマンドリストが真になるまでdo以下の処理をする。
Ø hhhというファイルを作る。
number=0
sum=0
until [ $sumber
-ge 10 ]
do
number=` expr
$number + 1`
sum=`expr $sum +
$number `
done
echo “SUM=$sum”
Ø cat hhh
Ø chmod +x hhh
Ø hhh
(6) デバッグ
シェルプロシージャのデバッグを行う。
Ø sh -v
Ø sh -x
3.Cシェル
(1) 機能
Bシェルの機能はほとんど備えており、それをさらに拡張したもの。
Ø ヒストリ機能
Ø エリアス機能
Ø C言語のコマンドを実行できる
(2) 実行と終了
Ø $ csh BシェルからCシェルへの変更 (Cシェル中にshと入力するとBシェルが起動する)
Ø % プロンプトが変わる
Ø %exit Cシェルの終了
Ø $ Bシェルに戻る
(3) ヒストリ機能
ユーザが打ち込んだコマンドをバッファに記憶して再利用することができる。
Ø %history 現在のヒストリリストに入っているコマンドを表示
Ø %set history=15 ヒストリの大きさを15に設定
Ø %set savehist=15 Cシェルから抜け出たときに保存するヒストリ個数を15に設定
Ø %set prompt = “[\!] %” プロンプトに現在のプロンプト番号を表示
Ø %!2 ヒストリリストの2番目のコマンドを実行
Ø %!! 1回前のコマンドを実行
Ø %!-2 現在より2番目前に入力されたコマンドを実行
Ø %コマンド !10:2 ヒストリリストの10番目の引数2を参照してコマンドを実行
Ø %コマンド !10:$ ヒストリリストの10番目の最後の引数を参照してコマンドを実行
Ø %コマンド !10:2-4 ヒストリリストの10番目の引数2から4を参照してコマンドを実行
(4) エイリアス機能
コマンド列に一つの名前をつけることができる。
Ø %alias 現在のエイリアスの状況を見る
Ø %alias ll ls -l コマンドls -lにllという名前を付ける
Ø %alias w ‘who ; echo “You are” ; whoami echoとwhoamiというコマンド列にwという名前をつける
Ø %alias last echo \!:$ コマンドlastに最後の引数をechoするという機能を持たせる
Ø %unalias エイリアス機能の解除
(5) メタキャラクタ
〜(チルダ):ホームディレクトリの参照
Ø %cp aaa 〜/. 現在のディレクトリのaaaというファイルをホームディレクトリに同名でコピーする
{ }:ファイルをグループ化する
Ø %cp {aaa,bbb,ccc} 〜/. 現在のディレクトリのaaaとbbbとcccというファイルをホームディレクトリに同名でコピーする
(6) シェル変数
文字列変数: %set 変数名=値 文字列変数の設定(Bシェルでは $変数=値)
Ø %set central=(tiger baystar swallow giant carp dragon)
Ø %echo $central
Ø %echo $central[3]
Ø %unset central
数値変数: %@ 変数名 演算子 式
演算子 意味
a=b a=b
a+=b a=a+b
a-=b a=a-b
a*=b a=a*b
a/=b a=a/b
a%=b a=a MOD b
( ) カッコ
! not
Ø %@ sum=0
Ø %echo $sum
Ø %@ sum=(5+2)
Ø %echo $sum
Ø %@ sum+=5
Ø %echo $sum
配列変数
Ø %set zero=(0 0 0 0)
Ø %@ zero[2]=(30)
Ø %@ zeru[3]=($zero[2]+9)
Ø %echo $zero
環境変数
Ø %env
Ø %setenv PATH =(. /bin /usr/bin /usr/local/bin)
Ø %set path=(. /bin /usr/bin /usr/local/bin)