シェルプログラミング

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


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