備忘録ということで。ちなみに、bash などでも使える・・・はず。
パターンマッチング
WORK_DIR="/tmp/data/sample/001/sample.view.html"
書き方 パターン結果
${WORK_DIR} /tmp/data/sample/001/sample.view.html
${WORK_DIR#/*/} /data/sample/001/sample.view.html
${WORK_DIR##/*/} sample.view.html
${WORK_DIR%.*} /tmp/data/sample/001/sample.view
${WORK_DIR%%.*} /tmp/data/sample/001/sample
上から順番に、
・変数の内容そのまま
・#の後ろのパターンに最初にマッチした部分を削除する
(この場合、最初の'/'から次の'/'の直前まで)
・##の後ろのパターンにマッチした一番長い部分を削除する
(この場合、最初の'/'から最後の'/'まで)
・%の後ろのパターンにマッチした最後の部分を削除する
(この場合、最後の'.'以降)
・%%の後ろのパターンにマッチした一番長い部分を削除する
(この場合、最初の'.'以降)
となる。'#'は先頭からパターンマッチを行うのに対し、'%'は最後尾からパターンマッチを行う。
変数の内容を置き換えてから実行
COMMAND1="/var/log/messages"
COMMAND2="| grep session | grep -v root"
eval cat ${COMMAND1} ${COMMAND2}
普通に考えたらこんな使い方はしないと思いますが、例えば grep で絞り込むキーワード数が変動の場合に、コマンドを前もって作成したい場合などに使うと思います。というか、そういう用途で使いました(笑)
しかし、普通に
cat ${COMMAND1} ${COMMAND2}
とやっただけでは、スペースを区切りとして全て cat へのパラメータとして渡されてしまい、うまくいきませんでした。
そこで、変数を一旦展開してからコマンドを実行させるために、eval を使います。eval を使うことで、まず ${COMMAND1} と ${COMMAND2} が展開され、
cat /var/log/messages | grep session | grep -v root
というコマンドとして、eval が実行してくれます。
シグナル発生時の処理
trap "exit 9" HUP INT QUIT KILL
シェルのシグナル処理は trap を使って行います。
上記例では、HUP(ターミナルを閉じたときなど)、INT(割り込み。Ctrl+Cなど)、QUIT(実行を中止したとき)、KILL(強制終了時)のときに、戻り値 9 をセットして exit します。他にプログラム終了時の TERM などもあります。
ちなみに、シグナルを無視するときは
trap "" INT
とすればOK。上記の場合は割り込みを無視します。また、
trap - HUP INT
とすれば、シグナル処理をリセットします。
コメント