Google Classroomの設置

シェルプログラミング

  • sh(SuperText 上巻 第40章 p.800)
  • cshプログラミング入門(SuperText 上巻 第39章 p.776)

シェルスクリプト

  • スクリプト:いくつかの処理手順をまとめて記述したプログラム
  • シェルスクリプト:シェル上で動作するスクリプトです.すなわち,一連のコマンドをファイル化し,一括実行できるようにしたものと考えられます.
  • tcsh:入力用として便利.ブログラミング言語として,一部欠陥がある.>   入力用に推奨
  • sh (bash):UNIX標準装備の古いシェルだが,プログラミング言語として十分 > シェルスクリプトに推奨

書式

  • 1行目に
    #!(シェルのパス)
    を記述することにより,シェルコマンドとして認識される.

csh系

#!/bin/csh -f
Command
Command

sh系

#!/bin/sh
Command
Command

hello.sh

#!/bin/sh
echo 'Hello world!'

test.sh

#!/bin/sh
ls
cal

実行法

sh hello.sh 

実行権をあたえると,直接ファイルをコマンドとして起動できる

chmod a+x hello.sh
./hello.sh

制御構造(sh系)

if コマンド1
then
   # コマンド1が正常終了した時に実行するコード
else
   # コマンド1がエラー終了した時に実行するコード
fi
while コマンド2
do
   # コマンド2が正常終了している間,実行するコード
done
for シェル変数名 in 値1 値2 値3…
do
   # 値1,値2,値3に関して実行するコード
done
case 文字列 in
パターン1)
   # 文字列がパターン1に合致するときに
   # 実行されるコード
   ;;
パターン2|パターン3)
   # 文字列がパターン2、あるいは3に
   # 合致するときに実行されるコード
   ;;
esac
# パターンとしてはワイルドカードの特殊文字が使える

変数

$n	nは数字であり、$0はシェルスクリプト名、以降$1、$2・・・は第1引数、第2引数・・・である。第10引数以降は${10}、${11}・・・で参照する。
$#	与えられた引数の個数
$@	$0以外の全ての引数("$@"のようにダブルクォーテーションで囲んだ場合"$1" "$2" ・・・"のように個別に展開される。)
$*	$0以外の全ての引数("$@"のようにダブルクォーテーションで囲んだ場合"$1 $2 ・・・"のように展開される。)
$?	最後に実行したコマンドの終了ステータス
$!	最後に実行したバックグラウンドコマンドのPID
$$	シェルのPID
$-	現在のオプションフラグ

例:test2.sh

#!/bin/sh
echo $#
echo $0 $1 $2 $3
echo $@
echo $*
echo $?
echo $!
echo $$
echo $-

シェルスクリプトとリダイレクション

ex1.sh

#!/bin/sh
for i in 1 2 3 4 5
do 
    echo "hello!"
    echo $i
done
$ sh ex1.sh

ex2.sh

#!/bin/sh
for i in {1..10}
do 
    echo "hello!"
    echo $i
done
$ sh ex2.sh

ex3.sh

#!/bin/sh
for i in {1..10}
do 
    pwd
    hoge
    echo $i
done
$ sh ex3.sh

標準出力をex.logに,

$ sh ex3.sh > ex.log

csh系

標準出力をex.logに,エラー出力をerr.logに

$ (sh ex3.sh > ex.log) >& err.log

全出力をex.logに

$ sh ex3.sh  >& ex.log

sh系

標準出力をex.logに,エラー出力をerr.logに

$ sh ex3.sh > ex.log 2> err.log

全出力をex.logに

$ sh ex3.sh > ex.log 2>&1

ヒアドキュメント

スクリプト中に,標準出力へ渡すデータを直接埋め込む
ex4.sh

#!/bin/sh
echo "あいうえお"
echo "かきくけこ"
echo "さしすせそ"
echo "たちつてと"

ex5.sh

#!/bin/sh
cat <<EOF
あいうえお
かきくけこ
さしすせそ
たちつてと
EOF

サンプルシェルスクリプト

  • menu.sh
    #!/bin/sh
    while true
    do
            echo "---------------"
            echo "メニュー"
            echo " 1. 日付"
            echo " 2. カレンダー"
            echo " 0. 終了"
            echo -n " command? > "
            read  request
            case $request in
                1)
                    date
                    ;;
                2)
                    cal
                    ;;
                0)
                    echo menu fished.
                    exit
                    ;;
                *)
                    echo "Wrong number!"
                    ;;
            esac
    done
    

csh系

  • menu.ch
    #!/bin/csh -f
    
    while(1)
    	echo "---------------"
    	echo "メニュー"
    	echo " 1. 日付"
    	echo " 2. カレンダー"
    	echo " 0. 終了"
    	echo -n " command? > "
    	set request=$<
    	switch( $request )
    	    case 1:
    		date
    		breaksw
    	    case 2:
    		cal
    		breaksw
    	    case 0:
    	    	echo menu fished.
    		exit
    	    default:
    		echo "Wrong number!"
    		breaksw
    	endsw
    end
    
  • mkhtml.ch
    #!/bin/csh -f
    # カレントディレクトリ上にあるPNGファイルの一覧をHTMLファイルに書き出す
    set htmlfile=test.html
    
    echo "<html>" > $htmlfile
    echo "<head>" >> $htmlfile
    echo "<title>PNG file list on $cwd</title>" >> $htmlfile
    echo "</head>" >> $htmlfile
    echo "<body>" >> $htmlfile
    
    foreach num (*.png)
    	echo -n "<img src=$num>" >> $htmlfile
    	echo "<caption>$num</caption>" >> $htmlfile
    	echo "<hr>" >> $htmlfile
    end
    
    echo "</body>" >> $htmlfile
    echo "</html>" >> $htmlfile
    

ネットワークの利用

本学科システムの利用法:

リモートにログイン

% ssh e1XXXXX@shell.ie.u-ryukyu.ac.jp
  • X Windowを用いてアプリケーションウィンドウを,ローカルに出したい場合
    % ssh -X -Y e1XXXXX@shell.ie.u-ryukyu.ac.jp
    (X11.appのターミナル(kterm,xterm等)からである必要があります.)

ネットワーク越しのファイルのコピー

% scp
% scp <ファイル名> <アカウント名>@<サーバー名>:<ディレクトリ>

例:

% scp test.html shell:
% scp test.html e11XXXX@shell.ie.u-ryukyu.ac.jp:
% scp test.html shell.ie.u-ryukyu.ac.jp:~/public_html

WWW (World Wide Web)

ページのアップロードと公開

テキスト 上巻p.536 第28章 28.6.3 インターネットに公開

WWWサーバー

URL (Uniform Resource Locator)

http://ie.u-ryukyu.ac.jp
http://ie.u-ryukyu.ac.jp/ie/students/students.html
http://ie.u-ryukyu.ac.jp/ie/students/~e16XXXX (e16XXXXのホームページ)
http://ie.u-ryukyu.ac.jp/~e16XXXX

実機:

urasoe.ie.u-ryukyu.ac.jp

サーバー:

apache

サーバーの設定ファイル:

/etc/httpd/conf/httpd.conf

ユーザーディレクトリ:

~/public_html
例:
http://ie.u-ryukyu.ac.jp/~koji/test.txt
は,ユーザーのホームディレクトリの
~/public_html/test.txtというファイルを参照する

学生のみなさんのユーザーディレクトリは,futenamにログイン後,

% cd public_html

です.


ディレクトリがあるかどうか確認しましょう

  • urasoeにログイン
    % ssh e1557XX@urasoe.ie.u-ryukyu.ac.jp
    
    % ls -ld public_html
    public_htmlがない場合:
    % mkdir public_html

ファイル,ディレクトリのパーミッション:

公開するファイルは,

-rwxr-xr-x ファイル
drwxr-xr-x ディレクトリ

であることが必要.そうでない場合,

chmod 755 <ファイル名>

で,モードの変更が必要.

ファイル転送:

scp <ファイル名> <アカウント名>@<サーバー名>:<ディレクトリ>
scp test.txt shell.ie.u-ryukyu.ac.jp:~/public_html
sftp <サーバー名>
rsync -e ssh [オプション] <ディレクトリ> <サーバー名>:<ディレクトリ>
rsync -auvz -e ssh --exclude '*~' ~/Sites/ shell:~/public_html

オプション:

-a   archive (ファイルについての情報を保つ)
-u   update  (新しければ更新しない)
-v   verbose (-vv より詳細なverbose)
-z   compress with zlib (圧縮して転送)
-b   backup  (古いファイルは ~ の付いた名前になる)
--exclude 指定したファイルを転送しない
-e ssh sshで転送

注意:

  • 上記の例は,~/Sitesディレクトリ下のファイルを,pw0XXの~/public_htmlディレクトリ以下に転送する
    rsync -auvz -e ssh ~/Sites pw0XX:public_html
    とすると,pw0XXの/~public_htmlの下にSitesディレクトリを作ってしまう.
  • すなわち,
    ~/public_html/Sites
    ができる


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-19 (木) 15:16:09 (1222d)