ユーザはUNIXにコマンドという命令を与えることで様々な処理ができますが、 実はコマンドは直接UNIXというOS(Operating System:オペレーティングシステ ム)に渡されているわけではありません。
「シェル」とは、OSとユーザの間に存在するソフトウェアのようなものです。 コマンドを待ち受けるプロンプトの表示も、またワイルドカードを使用した入力 の処理(例えば、ls *.txt)も、実はシェルの機能の一部なのです。 シェル(shell)という言葉は「殻」という意味を持ち、核(カーネル:kernel) となるOSを包み込んで、ユーザからのコマンドをわかりやすくOSへ伝えたり、 OSからの結果をユーザへ表示したりする役割を担っています。
ここで皆さんが使用しているシェルの種類を確認するために、 setコマンドを使用します。setコマンドを単独 で使用すると、ユーザのシェル変数が表示されます。下記のように実行してみてく ださい。
% set | more (表示結果の抜粋) prompt pc3240[susaki]!:%~% prompt2 %R? prompt3 CORRECT>%R (y|n|e|a)? savehist 500 shell /bin/tcsh shlvl 1 sourced 1 status 0 tcsh 6.10.00 (または) % set | grep shell shell /bin/tcsh
上記の内容から現在使用しているシェルは「/bin/tcsh」であ るとわかります。
UNIXのシェルには大きく分けて二つの系統があります。一つは「 sh」系統で、「sh」は 初期のUNIXに入っていたシェルで、現在もどのUNIXにも必ず入っています。 Linuxでは、このshを拡張した「bash」がよく使 われています。もう一つの系統は、「csh」 系統で、cshやtcshが有名です。みなさんもこのtcshを使っています。
どちらの系統も一長一短あるのですが、後述するシェルスクリプトを作成する際 には、sh系統が適切であると報告されています。ですので、今後、 シェルスクリプト作成の際には、bashを使用することとします。
ここで、シェルをbashへ変更させるために下記のように実行してみてください。
% bash bash-2.05$
のように、プロンプトが「bash-2.05$」と変更されるはずです。 今後は、この「bash」というシェルを使用して説明していきます。
変数と聞くとどのようなことを思い出すでしょうか?中学の数学では、
という一次関数を習ったと思います。ここで、xもyも変数といいます。xに3を代 入すればyは 3×3 + 5 = 14 という値をとります。
これから取り扱う変数というのは、上記のxのように「数 字や文字を代入するもの」と考えてください。数字の場合もありますし、 文字や文字列(文字のつながり)の場合もあります。
例えば、次のように入力してみてください。赤い表示が入力部分を指します。
これで変数「name」に「susaki」という文字列を代入したことになります。この nameという変数名は自分で自由に決めたものです。変数名は、アルファベットと 数字を用いて名前であれば、自分で自由に決められます。この変数の中身を 「echo」コマンドを使用して表示させると、
bash-2.05$ echo $name susaki
と表示されます。ここで注意しなくてはいけないのは、変数は入力時には「name」 のように記述すれば良かったものの、それ以外では「 $name」のように$の記 号をつけなくてはならない、ということです。また状況によっては「${name}」と { }でくくる場合もあります。 どちらの表記方法も覚えておきましょう。
上記の例では文字列を変数に代入しましたが、数字を代入してみましょう。
bash-2.05$ a=10 bash-2.05$ echo $a 10
と、数字を代入しても問題ありません。今度は数字の和を計算させてみましょう。 下記のように入力して実行してみてください。
bash-2.05$ b=20 bash-2.05$ echo $a+$b 10+20
10と20の和である30という結果を表示させたかったのですが、「10+20」と表示 されました。単に文字列として$aと$bが処理されてしまったのです。
数値計算させるためには、下記のように入力します。
bash-2.05$ expr $a + $b 30
今度は望み通り「30」と表示されました。
数値計算における注意点
bash-2.05$ expr $a * $b expr: syntax error bash-2.05$ expr $a '*' $b 200 bash-2.05$ expr $a \* $b 200
bash-2.05$ expr 20 / 10.3 expr: non-numeric argument bash-2.05$ echo "scale=5; 20 / 10.3" | bc 1.94174
「date」コマンドを使用すると、現在の日にち、時刻を表示してくれる。
bash-2.05$ date 2002年 5月 7日 火曜日 23:02:51 JST
「date」コマンドには様々なオプションがあり、例えば、日にちのみ表示させる には
bash-2.05$ date +%d 07
のように、オプション「+%d」をつけるとよい。一部のオプションを下記 に紹介するが、その他のオプションを知りたい場合には「man date」で調べると 良い。
(月だけの表示) bash-2.05$ date +%m 05 (年だけの表示) bash-2.05$ date +%y 02 bash-2.05$ date +%Y 2002 (時刻だけの表示) bash-2.05$ date +%T 23:08:32
bash-2.05$ day=`date +%d` bash-2.05$ echo $day 07
bash-2.05$ echo $day, $month, $year, $time 07, 05, 2002, 23:19:47
bash-2.05$ echo ***************** 2002/05/07-23:19:47
上記の「変数」の説明では、コマンドラインでいちいち変数に値を入力したりし ましたが、ここでは複数の処理を一気に行わせるために、 スクリプトを作ります。下記の手順にしたがって、「test1-1.sh」という シェルスクリプトを作ってみましょう。
bash-2.05$ which bash /bin/bash
#!/bin/bash family=須崎 name=純一 echo "私の名字は${family}で、名前は${name}です。"
bash-2.05$ ls -al test1-1.sh -rw-r----- 1 susaki teacher 38 5月 7 23:56 test1-1.sh
bash-2.05$ chmod +x test1-1.sh bash-2.05$ ls -al test1-1.sh -rwxr----- 1 susaki teacher 38 5月 7 23:56 test1-1.sh
bash-2.05$ ./test1-1.sh 私の名字は須崎で、名前は純一です。
bash-2.05$ ./test1-2.sh 今日は2002年05月08日です。 ただいまの時刻は08:54:30です。
(スクリプトの中身) #!/bin/bash age1=18 age2=******************** echo "私の現在の年齢は${age1}です。" echo "私の10年後の年齢は${age2}です。"
(実行結果) bash-2.05$ ./test1-3.sh 私の現在の年齢は18です。 私の10年後の年齢は28です。
(スクリプトの中身) #!/bin/bash year1=******************** year2=******************** echo "現在${year1}年です。" echo "10年後は${year2}年です。"
(実行結果) bash-2.05$ ./test1-4.sh 現在2002年です。 10年後は2012年です。