#navi(ソフトウェア演習I/14)

#contents

//*moodleの設定 [#c1e3a780]
//moodle
//-https://tarkus.eva.ie.u-ryukyu.ac.jp/moo/

*先週の続き [#v6a0b988]
-[[ソフトウェア演習I/13/第4回]]

*シェルプログラミング [#k77b1468]
-sh(SuperText 上巻 第40章 p.800)
-cshプログラミング入門(SuperText 上巻 第39章 p.776)
**シェルスクリプト [#q1f3f28f]
-スクリプト:いくつかの処理手順をまとめて記述したプログラム
-シェルスクリプト:シェル上で動作するスクリプトです.すなわち,一連のコマンドをファイル化し,一括実行できるようにしたものと考えられます.

-tcsh:入力用として便利.ブログラミング言語として,一部欠陥がある.>   入力用に推奨
-sh (bash):UNIX標準装備の古いシェルだが,プログラミング言語として十分 > シェルスクリプトに推奨
**書式 [#te80220f]
-1行目に
 #!(シェルのパス)
を記述することにより,シェルコマンドとして認識される.

csh系
 #!/bin/csh -f
 Command
 Command

sh系
 #!/bin/sh
 Command
 Command
**例 [#yaf905d8]
hello.sh
 #!/bin/sh
 echo 'Hello world!'

test.sh
 #!/bin/sh
 ls
 cal

**実行法 [#xe4393b1]
 sh hello.sh 

実行権をあたえると,直接ファイルをコマンドとして起動できる
 chmod a+x hello.sh
 ./hello.sh

*制御構造(sh系) [#d9bc5a24]
 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
 # パターンとしてはワイルドカードの特殊文字が使える

*変数 [#c8aa8c99]
 $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 $-

*シェルスクリプトとリダイレクション [#a8b4844c]
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系 [#e4efe647]
標準出力をex.logに,エラー出力をerr.logに
 $ (sh ex3.sh > ex.log) >& err.log
全出力をex.logに
 $ sh ex3.sh  >& ex.log
***sh系 [#f4216424]
標準出力をex.logに,エラー出力をerr.logに
 $ sh ex3.sh > ex.log 2> err.log
全出力をex.logに
 $ sh ex3.sh > ex.log 2>&1
*ヒアドキュメント [#sc000253]
スクリプト中に,標準出力へ渡すデータを直接埋め込む~
ex4.sh
 #!/bin/sh
 echo "あいうえお"
 echo "かきくけこ"
 echo "さしすせそ"
 echo "たちつてと"

ex5.sh
 #!/bin/sh
 cat <<EOF
 あいうえお
 かきくけこ
 さしすせそ
 たちつてと
 EOF
**サンプルシェルスクリプト [#kae26c1d]
-menu.sh
#pre(){{
#!/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
#pre(){{
#!/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
#pre(){{
#!/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
}}


#navi(ソフトウェア演習I/14)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS