SlideShare a Scribd company logo
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
USP 友の会
今泉光之
@bsdhack
http://bsdhack.org
仕事で使えるシェルスクリプト 2
講師講師
● 今泉光之
 UNIX/Linux環境でのプログラミングを中心に、ネットワークや
インフラなども含め20年以上に渡る経験だけは積んできました。
 当初はC言語でコンパイラ、Xサーバ、ドライバ、TCP/IPによる
通信などシステム系のプログラミングが主でしたが、最近はPerl
やPHPなどのWeb向けのLLも使っています。
仕事で使えるシェルスクリプト 3
POSIXPOSIX についてについて
●
POSIX とは
– Portable Operating System Interface
– 各種 UNIX OS を始めとする異なる OS 実装に共通の
API を定め、移植性の高いアプリケーションソフト
ウェアの開発を容易にすることを目的として IEEE
が策定したアプリケーションインタフェース規格
– 名前はリチャード・ストールマン提案による
仕事で使えるシェルスクリプト 4
なぜなぜ POSIXPOSIX かか
● 元々は Bourne Shell のみだったので互換性は問題なし
● シェルスクリプトは様々な環境で動作した
●
csh 、 tcsh 、 ksh 、 bash 、 zsh などの登場により機能は増加し
たが互換性は減少した
● ソフトウェア製品を様々なベンダーの数ある unix システムで
動作させるために互換性を意識する必要がある
仕事で使えるシェルスクリプト 5
どんな時にどんな時に POSIXPOSIX を意識するのかを意識するのか
● ソフトウェア製品の開発
– 色々な環境で動作させる事で開発コストが下がる
● 監査が厳しい状況
– 金融業界などは導入するソフトに制限がある
● そもそも bash は標準シェルじゃない
仕事で使えるシェルスクリプト 6
checkbashismscheckbashisms
● シェルスクリプトの lint(1) 的存在
– 引数で指定されたシェルスクリプトを解析して
POSIX に準拠していない部分を指摘する
– http://sourceforge.net/projects/checkbaskisms/
– Sourceforge からダウンロードできます
– 残念ながら perl スクリプト
仕事で使えるシェルスクリプト 7
POSIXPOSIX を気にしないを気にしない
●
POSIX を気にしない場面も必要
– アプライアンスサーバを作る場合
● 全て自前で揃える必要がある
● 組み込みに近いので独自仕様を優先する
● サイズや速度に制限がある場合もある
仕事で使えるシェルスクリプト 8
POSIXPOSIX を気にしないを気にしない
●
OS 固有の処理(起動スクリプトなど)
– redhat 系
● パラメタは /etc/sysconfig 以下にファイルを設置
● 起動スクリプトは /etc/rc.d/init.d 以下にファイルを設置
● 起動制御は chkconfig で指定
– FreeBSD
● パラメタ・起動制御は /etc/rc.conf に指定
● 起動スクリプトは /usr/local/etc/rc.d 以下にファイルを設置
仕事で使えるシェルスクリプト 9
POSIXPOSIX まとめまとめ
基本は POSIX を意識するが
必要があれば
敢えて POSIX を無視する必要もあります
仕事で使えるシェルスクリプト 10
フィルターコマンドフィルターコマンド
● 標準入力から入力を受け取り結果を標準出力に
出力するコマンド。
– パイプによりコマンドを連続で実行できる
– unix のコマンドでは基本的な動作(例外あり)
– 余計な出力はせずに必要なデータのみ出力
– エラーは標準エラー出力に
仕事で使えるシェルスクリプト 11
シェル変数シェル変数
● シェル組み込みの set コマンドを活用する事で
シェルスクリプトの開発や運用が 32 倍 ( 当社
比 ) 捗ります
– マニュアル(オンラインマニュアル)を活用しよう
– できれば原文(英語)でマニュアルを読もう
仕事で使えるシェルスクリプト 12
シェル変数シェル変数 -e-e
● スクリプト実行時に制御文以外でエラーが発生
した場合に スクリプトを終了させる。
$ cat foo.sh
#!/bin/sh
set -e
files=`la ${tmpdir}`
echo "FILES: ${files}"
$ sh foo.sh
foo.sh: line 3: la: command not found
仕事で使えるシェルスクリプト 13
シェル変数シェル変数 -x-x
● コマンドが実行される前にコマンドと変数の展
開結果を stderr に出力する。
$ cat foo.sh
#!/bin/sh
set -x
files=`ls ${tmpdir}`
echo "FILES: ${files}"
$ sh foo.sh
++ ls
+ files='bar
baz 以下略
仕事で使えるシェルスクリプト 14
シェル変数シェル変数 -v-v
● シェルの入力行を stderr に出力する。
$ cat foo.sh
#!/bin/sh
set -v
files=`ls ${tmpdir}`
echo "FILES: ${files}"
$ sh foo.sh
files=`ls`
ls
echo "FILES: ${files}" 以下略
仕事で使えるシェルスクリプト 15
シェル変数シェル変数 -n-n
● コマンドの実行を抑止する。文法チェックや前
述の -v と組み合わせて使用すると便利。
$ cat foo.sh
#!/bin/sh
set -vn
files=`ls ${tmpdir}`
echo "FILES: ${files}"
$ sh foo.sh
files=`ls`
echo "FILES: ${files}"
仕事で使えるシェルスクリプト 16
シェル変数シェル変数 -u-u
● シェル変数を展開した時に値が設定されていな
い場合はエラーとする。
$ cat foo.sh
#!/bin/sh
set -u
tmpdir="/tmp"
rm -r ${tnpdir}/*
$ sh foo.sh
foo.sh: line 4: tnpdir: unbound variable
仕事で使えるシェルスクリプト 17
変数展開変数展開
● シェルによる変数展開を活用しよう
– ${parameter:-word} デフォルト値への置換
– ${parameter:=word} デフォルト値の代入
– ${parameter:?[word]} 値の検査とエラー
– ${parameter:+word} 代替値の使用
– ${#parameter} 文字列長の取得
– ${parameter%word} 最短後置パターンの削除
– ${parameter%%word} 最長後置パターンの削除
– ${parameter#word} 最短前置パターンの削除
– ${parameter##word} 最長前置パターンの削除
仕事で使えるシェルスクリプト 18
デフォルト値への置換デフォルト値への置換
● ${parameter:-word}
– ${parameter} が NULL の場合 word に置換される。
$ echo ${foo}
$ echo ${foo:-HOGE}
HOGE
$ echo ${foo}
$ foo=FUGA
$ echo ${foo:-FOO}
FUGA
仕事で使えるシェルスクリプト 19
デフォルト値の代入デフォルト値の代入
● ${parameter:=word}
– ${parameter} が NULL の場合 word に置換され parameter
に代入される。
$ echo ${foo}
$ echo ${foo:=HOGE}
HOGE
$ echo ${foo}
HOGE
$ echo ${foo:=FUGA}
HOGE
仕事で使えるシェルスクリプト 20
値の検査とエラー値の検査とエラー
● ${parameter:?[word]}
– ${parameter} が NULL の場合 word かデフォルトの値を
表示しシェルをエラー終了させる。
$ echo ${foo}
$ echo ${foo:?HOGE}
HOGE
仕事で使えるシェルスクリプト 21
代替値の使用代替値の使用
● ${parameter:+word}
– ${parameter} が NULL 以外の場合 word に置換される
$ echo ${foo:+HOGE}
$ echo ${foo}
$ foo=FUGA
$ echo ${foo}
FUGA
$ echo ${foo:+HOGE}
HOGE
仕事で使えるシェルスクリプト 22
文字列長の取得文字列長の取得
● ${#parameter}
– ${parameter} の文字列としての長さに置換される。
$ echo ${foo}
$ echo ${#foo}
0
$ foo=HOGE
$ echo ${foo}
HOGE
$ echo ${#foo}
4
仕事で使えるシェルスクリプト 23
最短後置パターンの削除最短後置パターンの削除
● ${parameter%word}
– ${parameter} の右から word で示されるパターンの最短
部分を削除する。
$ echo ${foo}
$ echo ${#foo}
0
$ foo=HOGE
$ echo ${foo}
HOGE
$ echo ${#foo}
4
$ foo=/hoge/fuga/moge
$ echo ${foo%/*}
/hoge/fuga
$ foo=hoge.c
$ echo ${foo%.*}
hoge
$ foo=fuga
$ echo ${foo%.*}
fuga
仕事で使えるシェルスクリプト 24
最長後置パターンの削除最長後置パターンの削除
● ${parameter%%word}
– ${parameter} の右から word で示されるパターンの最長
部分を削除する。
$ foo=hoge.fuga.moge
$ echo ${foo%%.*}
hoge
$ foo=http://hoge.fuga.moge:8888/
$ echo ${foo%%:*}
http
$ foo=fuga
$ echo ${foo%%.*}
fuga
仕事で使えるシェルスクリプト 25
最短前置パターンの削除最短前置パターンの削除
● ${parameter#word}
– ${parameter} の左から word で示されるパターンの最短
部分を削除する。
$ foo=hoge.c
$ echo ${foo#*.}
c
$ foo=hoge.fuga.moge
$ echo ${foo#*.}
fuga.moge
$ foo=fuga
$ echo ${foo#*.}
fuga
仕事で使えるシェルスクリプト 26
最長前置パターンの削除最長前置パターンの削除
● ${parameter##word}
– ${parameter} の左から word で示されるパターンの最長
部分を削除する。
$ foo=hoge.fuga.moge
$ echo ${foo##*.}
moge
$ foo=/hoge/fuga/moge
$ echo ${foo##*/}
moge
$ foo=fuga
$ echo ${foo##*.}
fuga
仕事で使えるシェルスクリプト 27
traptrap の活用の活用
●
trap (1) で 0 を指定する
– スクリプトが正常終了した時にも指定した処理が実
行されるので、プログラム中で作成した一時ファイ
ルの削除などにはもってこい。
tmpdir="${TMP:-/tmp}/`basename ${0}`.$$"
mkdir -p "${tmpdir}"
trap 'rm -r "${tmpdir}"' 0
仕事で使えるシェルスクリプト 28
コマンドの活用コマンドの活用
● コマンドの機能をフルに活用する
grep "^HOGEHOGE=" file | awk 'BEGIN { FS = "="} { print $2 }'
↓
awk 'BEGIN{FS="="}/^HOGEHOGE=/{ print $2 }' file
awk 'BEGIN{FS="="}{ if($1 == "HOGEHOGE") print $2 }' file
もしくは
sed -n '/^HOGEHOGE=/s/^.*=//p' file
仕事で使えるシェルスクリプト 29
ヒアドキュメントの活用ヒアドキュメントの活用
● 複数行の固定データなどはヒアドキュメントを
活用する
echo "1 行目 " > ${file}
echo "2 行目 " >> ${file}
:
echo "n 行目 " >> ${file}
↓
cat << EOF > ${file}
1 行目
2 行目
:
n 行目
EOF
仕事で使えるシェルスクリプト 30
setset の活用の活用
● スペース区切りのデータ解析は set を活用
date="`date '+%Y %m %d'`"
year="`echo ${date} | awk '{ print $1 }'`"
month="`echo ${date} | awk '{ print $2 }'`"
day="`echo ${date} | awk '{ print $3 }'`"
↓
set -- `date '+%Y %m %d'`
year="${1}"
month="${2}"
day="${3}"
仕事で使えるシェルスクリプト 31
正規表現正規表現
● 正規表現の種類
– POSIX 1003.2 で定義されている
– 拡張正規表現 : egrep などモダンな実装
– 基本正規表現 : ed など旧来の実装
●
| 、 + 、 ? は存在しない
●
{ 、 } 、 ( 、 ) はそれぞれ { 、 } 、 ( 、 )
●
^ 、 $ は正規表現の先頭 / 末尾意外では普通の文字
– + 、 ? は代替の表現があるが | の代替は面倒
● シェルの glob とは異なるので注意
仕事で使えるシェルスクリプト 32
宿題宿題
● 重複ファイルの削除
– mh 形式のメイルファイルで重複したメイルを削除
●
apache ログの成形
– apache のログから URL 毎のアクセス回数を取得
●
postfix ログの成形
– postfix のログを成形してメッセージ毎に出力

More Related Content

仕事で使えるシェルスクリプト