190 likes | 318 Views
情報工学科 3 年生対象 専門科目. システムプログラミング. 第5回. シェルスクリプトの続き レポート課題 main 関数の引数 usage メッセージ. 情報工学科 篠埜 功. 今日の内容. expr コマンド ヒアドキュメント レポート課題出題 C プログラムの main 関数の引数について Usage メッセージについて. expr 文. 四則演算をシェルスクリプトで行う場合、 expr コマンドを用いる。 expr コマンドは結果を標準出力に出す。. (例) sh-3.2$ i=3 sh-3.2$ j=4
E N D
情報工学科 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 fileexists. と表示して終了するようにせよ。実行方法は、 $ ./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 メッセージ • オプションが正しく与えられなかった場合 (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