Transcript ppt file

情報工学科 3年生対象 専門科目
システムプログラミング
第5回
シェルスクリプトの続き
レポート課題
main関数の引数
usageメッセージ
情報工学科
篠埜 功
今日の内容
•
•
•
•
•
exprコマンド
ヒアドキュメント
レポート課題出題
Cプログラムのmain関数の引数について
Usage メッセージについて
expr文
四則演算をシェルスクリプトで行う場合、exprコマンド
を用いる。exprコマンドは結果を標準出力に出す。
(例)
sh-3.2$ i=3
sh-3.2$ j=4
sh-3.2$ expr $i + $j
7
sh-3.2$ i=`expr $i + 1`
sh-3.2$ echo $i
4
足し算 +
引き算 –
かけ算 ¥*
割り算 /
剰余 %
(注意) 演算子の左右の空白は必ず必要。
while文
構文
while commands; do commands; done
commands: コマンドをセミコロンで区切ったもの
意味
whileの隣に書かれたcommands(の最後のコマンド)
の終了statusが0である間do以下のcommandsを実
行。
セミコロンは改行で置き換えてよい。
while文はコマンドであり、コマンドが書けるところには自由に書
くことができる。
while文の例
(打ち込んで確認)
#!/bin/sh
i=1
while test $i -le 5
do
echo test $i
i=`expr $i + 1`
done
exit 0
ヒアドキュメント
シェルスクリプト内部で、コマンドへのキーボードからの入力を
シェルスクリプト内に直接書いておくことができる。
コマンド << str
………
str
のように、<<の右に区切り文字列を(自分で決めて)書き、その
次の行から、指定した文字列が最初に現れるまでの部分を、
ファイルからコマンドへ < でリダイレクトしたのと同等の効果が
ある。
ヒアドキュメントの例1(打ち込んで確認)
#!/bin/sh
cat << EOF
<html>
<body>
hello
</body>
</html>
EOF
上記のようにある程度長いメッセージを
出力したい場合、ヒアドキュメントを使うと
きれいに書ける。
ヒアドキュメントの例2(打ち込んで確認)
#!/bin/sh
cat << EOF > sample.c
#include <stdio.h>
int main (void) {
printf ("test\n");
return 0;
}
EOF
gcc -o sample sample.c
./sample
これはシェルスクリプト内でCのファイルを作成し、
コンパイルして実行する例である。
レポート課題2
課題2-1, 2-2, 2-3の3つの課題(後述)のシェ
ルスクリプトをkadai2-1.sh, kadai2-2.sh,
kadai2-3.shというファイル名で作成せよ。
レポートの提出方法
□ 下記のファイルを作成し、提出
• kadai2-1.sh, kadai2-2.sh, kadai2-3.sh, kadai2.txt
□ 提出方法
システムプログラミング講義用の課題提出用フォルダ内に
あるkadai2というフォルダの中に自分の学籍番号を名前と
するフォルダを作成し、その中に上記ファイルを置く。
kadai2.txt内に学籍番号、氏名、日付、および作成したプ
ログラムの簡単な説明を記載する。
□ 提出期限
11月13日 23:59 まで。締め切り後に提出した場合、成績
への反映を保証しない。
課題2-1
テキストファイルのファイル名をシェルスクリプトの引数とし
て受け取り、そのファイルが存在すればファイルの中身を
表示し、存在しない場合には、
ファイル名: No such file exists.
と表示して終了するようにせよ。実行方法は、
$ ./kadai2-1.sh test.txt
のようにファイル名を引数として与える。この場合、test.txt
というファイルが存在すれば中身を表示する(表示はcatコ
マンドを使えばよい)。存在しなければ上記のメッセージを
表示する。
ファイルの存在確認は、testコマンドを用いて、
test –f ファイル名
で行うようにせよ。コマンド “test –f ファイル名”
の終了statusは、そのファイルが存在して通常
のファイルなら真、そうでなければ偽である。
課題2-2
課題2-1のプログラムに,引数の個数チェックを
行う処理を追加し、ファイル名が引数に与えら
れなかった場合、
$ ./kadai2-2.sh
Usage:./kadai2-2.sh filename
のようにエラーメッセージを表示するようにせよ。
引数の個数は$#という変数に入っており、testコマンドで
test $# -eq 0 (あるいは [ $# -eq 0 ])
により、引数が0個かどうかを判定できる。
起動したコマンド名(この場合は./kadai2-2.sh)は$0に
入っているのでそれを使う。
課題2-3
以下の例のように*で埋め尽くされた長方形を画面に表示する
シェルスクリプトを作成せよ。ただし、シェルスクリプトの第一引
数に縦の長さ、第二引数に横の長さを受け取るようにせよ。
$ ./kadai2-3.sh 3 5
*****
*****
*****
$
echoコマンドでメッセージ表示後に改行しないようにするに
は
echo –n ….
のようにすればよい。また、*は特別な意味を持つので、echo
で*を表示する場合は*をダブルクォートで囲む。
Cのmain関数の引数について
/* コマンド名および引数を表示 */
#include<stdio.h>
int main (int argc, char *argv[ ]) {
for ( ; *argv; argv++)
printf ("%s\n", *argv);
return 0;
}
(実行例) $ gcc 1.c
$ ./a.out abc 234
./a.out
abc
234
$
main関数の第3引数
main関数は第3引数に環境変数の情報の配列が渡される
場合がある。(ISO規格で定められているわけではなく、処理
系依存。)
#include<stdio.h>
int main (int argc, char *argv[ ], char *envp[ ]) {
for ( ; *envp; envp++)
printf ("%s\n", *envp);
return 0;
}
演習室の環境では第3引数を受け取れる。第3引数はなく
てもよい。環境変数はライブラリ関数getenv()で取得できる
のでそれを使えばよい。
スタートアップルーチン
C言語プログラムは、実行形式ファイルにするときにスタート
アップルーチンとリンクされる。
スタートアップルーチンは、/usr/lib64/crt1.oにある。
$ gcc -print-file-name=crt1.o
でcrt1.oの場所が表示される。
$ nm /usr/lib64/crt1.o
でcrt1.oの中身を確認する。この出力結果に
U main
という行が含まれており、スタートアップルーチンがmain関数
を呼び出していることがここに反映されている。
Uはmainが未定義であることを表す(main関数は別のファイ
ルで定義される)。
スタートアップルーチン部分で引数の個数、引数の文字列配
列、環境変数配列をmain関数に渡す。
コマンドのオプションについて
• オプションはハイフンのあとに1文字(-oなど)
• オプションのあとにオプションの引数があること
もある
– (例) gcc –o main main.c など。
• いくつかのオプションをまとめて記述することも
ある
– 例 ls -la は、ls -l -a をまとめて書いたものである。
• --helpのように、ハイフンが2つの場合もある。(
これは-h -e -l -pを-helpと書いた場合との区別
のため)
Usage メッセージ
(1)オプションが正しく与えられなかった場合
(2) コマンドの引数に過不足があった場合
このような場合にメッセージを出すのが普通。こ
れをUsageメッセージという。
例えば、 $ cp のようにcpコマンドを引数無しで
実行すると、Usageメッセージが表示される。
例(打ち込んで確認)
/* Usageメッセージを表示するだけのプログラム */
#include<stdio.h>
int main (int argc, char * argv[]) {
if (argc!=2)
fprintf (stderr, "Usage: %s filename\n", argv[0]);
return 0;
}
(実行例)
$ gcc usage.c
$ ./a.out
Usage: ./a.out filename