シェルプログラミング

  • 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 $-

シェルスクリプト

csh系

  • menu.ch
    #!/bin/tcsh
    
    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
    #!/usr/local/bin/tcsh
    # カレントディレクトリ上にある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
    

レポートその10

  • 提出はmoodleで

bashスクリプト

  • menu.chをsh系に翻訳せよ.(shで実行可能にせよ)

スクリプト読解

  • EasyPackageより, math/gnuplot 4.0_01と,graphics/aquaterm 1.0_01をインストールすること.
    • aquatermをデフォルトのgnuplot出力ウィンドウするために,".tcshrc"に
      setenv GNUTERM aqua
      を追加しておくといいです.
  • 次のスクリプトをplot.shという名前で保存しなさい.
  • numは,自分の学籍番号とすること.
  • このスクリプトを実行すると,gnuplotより,数式グラフ画像が保存される.
    Expand allFold all
      1
      2
      3
      4
      5
      6
      7
      8
      9
    
    -
    !
     
     
     
     
     
     
     
    
    #!/bin/sh
    num=j070XX
    echo "set terminal png" > $num.gplot
    echo "set output \"$num.png\"" >> $num.gplot
    echo "set xrange [-2:2]" >> $num.gplot
    echo "set yrange [-2:2]" >> $num.gplot
    echo "set isosample 40,40" >> $num.gplot
    echo "splot x*x*exp(-x*x)*y*y*exp(-y*y)" >> $num.gplot
    gnuplot < $num.gplot
  1. 上記スクリプトを引用し,各行説明しなさい.
  2. 別なグラフを出力するよう上記スクリプトを改変しなさい.人と違ったグラフ(数式)を使うこと. (新スクリプトは,メール内に書くこと.添付してはいけない.)
  3. 次のスクリプトは,/etc/weeklyの抜粋である.スクリプトを引用し,各行説明しなさい.
    Expand allFold all
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
    
    -
    !
    -
    -
    |
    |
    |
    |
    |
    |
    |
    |
    !
    !
    
    #!/bin/sh 
    cd /var/log
    for i in ftp.log lookupd.log lpr.log mail.log netinfo.log hwmond.log ipfw.log ppp.log secure.log; do
        if [ -f "${i}" ]; then
            printf %s " $i"
            if [ -x /usr/bin/gzip ]; then gzext=".gz"; else gzext=""; fi
            if [ -f "${i}.3${gzext}" ]; then mv -f "${i}.3${gzext}" "${i}.4${gzext}"; fi
            if [ -f "${i}.2${gzext}" ]; then mv -f "${i}.2${gzext}" "${i}.3${gzext}"; fi
            if [ -f "${i}.1${gzext}" ]; then mv -f "${i}.1${gzext}" "${i}.2${gzext}"; fi
            if [ -f "${i}.0${gzext}" ]; then mv -f "${i}.0${gzext}" "${i}.1${gzext}"; fi
            if [ -f "${i}" ]; then mv -f "${i}" "${i}.0" && if [ -x /usr/bin/gzip ]; then gzip -9 "${i}.0"; fi; fi
            touch "${i}" && chmod 640 "${i}" && chown root:admin "${i}"
        fi
    done

関連



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-06-20 (木) 14:45:26 (2342d)