#!/bin/sh # シェルスクリプト全体の構成は # - usage # - デフォルト変数定義 # - トラップ(必要なら) # - 関数定義 # - 引数解析 # - メイン # てな固まりで配置すると見通しが良くなる。 myname=`basename $0` # 自分のファイル名を得る usage () { # usageを表示する関数を先頭にしておくと親切 cat<<_EOU_ $myname: サンプルのスクリプトなり オプションにはこんなんがあるじょー -f 定義ファイル デフォルト定義ファイルを指定 -d 作業ディレクトリ 作業ディレクトリを指定 -v おしゃべりもーど _EOU_ exit 0 } # ここからデフォルト変数定義。=(イコール)の前後に空白はだめよ conf=~/.samplerc verbose=0 tmpdir=/tmp tmpfile=$tmpdir/$myname-$$ RM=/bin/rm finalize () { # 途中で ^C されたときにやるべき処理 $RM -f $tmpfile # 特に必要なければ書かない echo 'さらばい.' exit 1 } trap finalize INT QUIT # 拾うシグナルを列挙 # 関数定義をつらつらと readconf () { # if なんちゃら then ほげほげ # だけのときは次のように書くと簡潔 [ -f $conf ] && . $conf # ちなみに . はcshでいうsourceね。 } job_A () { # 関数に引数だって取れるのさ # シェルスクリプトへの引数と同じように利用できる。 # forでぐるぐる回して処理するときは、"$@" で展開するのが鉄則 for f in "$@" do [ $verbose -gt 0 ] && echo Calculating $f... 1>&2 # 1>&2 でエラー出力に吐き出す。 # cshだけの力でできるか? できねーだろおりこうさん。 cat $f | awk '{sum+=$1}END{print sum}' # ちなみにこれは与えられたファイルの各行第一フィールドの合計を表示 done } # 引数解析をつらつらと # ポイントは、最初に - で始まるオプションを読み切ってしまい # 処理対象となる引数が来たら break してメイン処理に回す。 readconf while [ "$1" != "" ]; do case "$1" in -f) shift; conf="$1" ;; -v) verbose=1 ;; -h) usage ;; # -h helpオプション --) shift; break ;; *) break ;; # -で始まらないものが来たら即処理突入 esac shift done # そんでメイン # 引数が一つもなかったらusage表示しておしまい if [ "$1" = "" ]; then usage fi # 上で定義したjob_A()関数もこんな風に一般コマンドのように呼べる job_A "$@" | awk '{sum+=$1}END{print sum}' > $tmpfile cat $tmpfile # おちまい $RM -f $tmpfile exit 0 # if [ 式 ]; then # ほげほげ # elif [ 式 ]; then # ほげ # else # ぶはー # fi # while [ 式 ] # do # ほげ〜 # done # for 変数 in リスト # do # うにゃら〜 # done # case 値 in # パターン1) ほじゃら # がじゃら # ;; # パターン2) うんじゃま # かんじゃま # ;; # *) でふぉるとアクション # ;; # esac ### if と while の [ 式 ] に関しては man test(1)