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

  • 0 views
Uploaded on

シェルスクリプトワークショップの資料です。

シェルスクリプトワークショップの資料です。

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
0
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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 のログを成形してメッセージ毎に出力