ONLY Mobile

Kornシェル(ksh)あれこれ

備忘録ということで。ちなみに、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

とすれば、シグナル処理をリセットします。

スポンサーリンク

この記事をシェア

アカウントをフォロー