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