〜Bournシェル(sh)のスクリプトに関するメモ〜
Bournシェル(sh)にはできて、cshにはできない事が結構ある。
はまる迄は便利だと思っていたが、はまった後、脱出までに費やした時間と労力を考えると…
リダイレクションとファイル操作ではまる事が多い。機能が貧弱というか…
unixのコマンドは標準入力から受け取ったデータを処理し、結果を標準出力に吐くのが基本です。
awk, bzip2, commpress, grep, sed なども 標準入力 → 加工 → 標準出力 の流れが基本です。
コマンドオプション(コマンドパラメタ)は、処理内容を指示するものであってデータそのものを指定するものではありません。
例外となる echo と cat が頻繁に使われるのが謎ですけど
例として tee コマンドを挙げます。
標準入力から入力した文字列を、コマンドオプション(パラメタ)で指定されたファイルと標準出力に吐くコマンドです。
パラメタ指定がおかしいとか、権限がなくてファイルが開けないといったエラーが発生した場合は標準エラー出力にエラーを吐きます。
以下の文字はエスケープする必要がある
; & ( ) | ^ < > ? * [ ] $ ` " ' { } [TAB] [SPACE]
$1 $2 $3 ... $9
$*と$@の使い分けが難しい(判断が微妙)
この宣言を行わないと子プロセスで参照できない
$? :最後に実行したコマンドのexit値。
$$ :シェル自身のプロセスID 。
$! :シェルが最後に起動したバックグラウンドプロセスのプロセスID。
$0 :スクリプトの名前(プログラム名)
$- :シェルの起動オプション
『Bournシェル(sh)の展開は正規表現ではない』
ls >outputfile 2>&1
ls >>outputfile 2>&1
標準出力と標準エラー出力ともに file に出力される。
$ command 2>&1 >file標準出力が file に出力され、標準エラー出力は標準出力(この場合は端末)に出力される。
プログラムはファイルディスクリプタ0から入力し、ファイルディスクリプタ1および2に出力する。
2>&1 という記述は、ファイルディスクリプタ1の指す内容(ファイルの実体)をファイルディスクリプタ2に代入する事を意味する。
(ls dir1;ls dir2) > outputfile
コマンドを単純に別プロセスで実行したい場合
(ls dir1) &
’で括る。
(”で括った場合、変数置換・コマンド置換が実行される)
exprは整数のみ対応であるため、0.125などを入力するとエラーになる
この場合は bc を利用する。
rc=`echo "0.125 * 1024" | bc`
ピリオド(.)がインクルード命令になっている。
. filename
その位置にfileを読み込む
インクルードファイルの位置を自動算出する
CWD=`dirname $0`
. ${CWD}/config.sh
正規化されたパスが必用な場合
BASE_DIR=(cd $(dirname $0); pwd)
rc=`echo ${str} | cut -d, -f1`
カンマ区切りの最初の項目を取得する