「PlayBeep.sh」の編集履歴(バックアップ)一覧に戻る
PlayBeep.sh - (2008/01/13 (日) 14:16:18) のソース
標準Linuxの/usr/local/bin/内にある。 *スクリプト ~ # cat /usr/local/bin/PlayBeep.sh #!/bin/sh if [ -f "$1" ] ; then TEMPO=`grep "TEMPO=" $1|sed -e "s/TEMPO=//"` MELODY=`grep -v "TEMPO=" $1` PLAYDATA="${TEMPO} ${MELODY}" else MELODY=`echo $*| sed -e "s/$0//"` PLAYDATA=${MELODY} fi miconapl -a bz_melody ${PLAYDATA} ~ # *実行してみる スクリプトの実行には引数(パラメーター)が必須。引数をつけずに実行すると ~ # PlayBeep.sh sed: bad option in substitution expression err: ComSetBZMelodyArg: must need parameter. ~ # とエラーが出力される。 *スクリプト詳細 一文づつ見てみよう。 #!/bin/sh シェルの指定。shを指定している。 if [ -f "$1" ] ; then $1とは、スクリプトを実行した際の引数の1番目(第1パラメーター)を意味する。そして-fオプションでこの引数が通常ファイルかどうかを判別している。 「fi」とある行までが条件文だ。 引数が通常ファイルであれば真となりthen以降の命令文を実行。引数が通常ファイルではなかったり(たとえばディレクトリ、デバイスなど)引数そのものがなければ下のelse以降が実行される。 TEMPO=`grep "TEMPO=" $1|sed -e "s/TEMPO=//"` then以降の実行文は3行あるが、その1行目。 >TEMPO='命令文1' とあり、命令文1での結果をTEMPOという名の変数に代入しろ、という内容だ。 命令文1を見てみる。 >grep "TEMPO=" $1|sed -e "s/TEMPO=//" grepコマンドと引数、パイプ、sedコマンドで成り立っている。 まずは >grep "TEMPO=" $1 で、引数の内容から「TEMPO=」を含む行を抽出している。 その結果を >sed -e "s/TEMPO=//" に渡している。 結論から言えば「TEMPO=」を除去しているわけだが、これで抽出された文字列が命令文1の結果となり >TEMPO=命令文1の結果 となる。 MELODY=`grep -v "TEMPO=" $1` then以降の実行文は3行あるが、その2行目。 TEMPO同様に考えれば >MELODY=`命令文2` ということで、命令文2の結果をMELODYという変数に代入するという意味だ。 命令文2を見てみると >grep -v "TEMPO=" $1 とシンプルだ。 grepコマンドの-vオプションとは「パターンに一致しない行を抽出」という意味だ。 つまり、ここでは先ほどまでの「TEMPOを含む行の抽出」の真逆の「引数から『TEMPO=』を含まない行を抽出」となっている。 これを「MELODYとしろ」という意味だ。 PLAYDATA="${TEMPO} ${MELODY}" then以降の実行文は3行あるが、その3行目。 上記2行の結果をそれぞれ代入したものを「PLAYDATA」という変数に代入している。 else ここからは「引数が通常ファイルではなかったり(たとえばディレクトリ、デバイスなど)引数そのものがなければ実行する」という部分だ。 MELODY=`echo $*| sed -e "s/$0//"` else以降の実行文は2行あるが、その1行目。 今まで通りに >MELODY=`命令文3` として考える。 命令文3をMELODYに代入しろ、というわけだ。TEMPOはこの場合(引数が妥当でない場合)には設定しないらしい。 命令文3とは >echo $*| sed -e "s/$0//" となっている。 まずは >echo $* $*とは「全ての引数を空白で区切り、まとめて1つの変数として値とする」という特殊パラメーター。 **test.mldで追ってみる 以下のようなファイルを用意してみた。 ~ # cat test.mld TEMPO=120 b3 c3 d3 e3 f3 g3 a3 b4 ~ # これを使って >~ # PlayBeep.sh test.mld としてみると、音が鳴るはずだ。 このときのPlayBeep.shの処理を具体的に追ってみる。 ----