- 追加された行はこの色です。
- 削除された行はこの色です。
[[Language]]
* 目次 [#kd018898]
#contents
////////////////////////////////////////////////////////////////////////////////
* 共通 [#udbf4d6a]
** コメント [#m841fda8]
-- "#" 以降がコメントになる
-- 式を書いた後にコメントを書く場合、 "#" の前に ";" がないとエラーになるので注意
** 1sec 未満の sleep [#n27d57ab]
- 1sec未満の sleep をするには、sleep ではなく、after を使用する。単位はmsecである。
# 50msec の sleep
after 50;
** 変数 [#b8ea3b68]
- 宣言
-- 宣言・代入する時は、変数名に接頭辞をつけない
set AAA "1234";
-- 参照する時は、接頭辞 "$" をつける。$変数名 とするか、${変数名} と表記する。
puts "AAA: ${AAA}\r";
puts "BBB: $BBB\r";
-- ※宣言されていない変数を参照しようとすると、スクリプトabortするので注意すること。
** 関数 [#qf190abc]
- 関数定義
proc function_name { arg1 arg2 } {
# 実装
return ${value}; # 返り値を返す場合
}
-- 関数名は、キーワード "proc" に続けて書く
-- 引数には、接頭辞(?) "$" はつけない。区切りはコンマではなくスペース
- 関数呼び出し
function_name ${aa} ${bb}; # 通常の呼出しの場合
set return_value [ function_name ${aa} ${bb} ]; # 返り値を取得する場合
** グローバル変数 [#cfce567f]
- グローバル領域に変数を定義し、その変数を参照する関数内で、 "global" 文にて列挙する必要がある
#!/usr/bin/expect
set G_VAL1 "";
proc func_name { arg1 arg2 } {
global G_VAL1;
if { ${arg1} > 10 } {
set G_VAL1 ${arg1};
} else {
set G_VAL1 ${arg2};
}
}
** 他のスクリプトファイルから関数や変数を取り込む [#za16d2cc]
- あるスクリプト(script-main.xとする)から、別のスクリプトファイル(script-sub.xとする)の中身を取り込みたいときは、以下のように記述する:
source "script-sub.x";
-- これにより、script-sub.x の定義内容が、元からscript-main.xに書かれていたかのように扱える。
** 時間 [#md0caab7]
- 現在時間の取得
set time_stamp [ clock clicks -milliseconds ];
-- "-milliseconds" オプションを付けると、msecオーダーの精度が保証される。
- 上記で取得した時間の値 time_stamp を書式化して、time に格納する。
set time [ clock format ${time_stamp} -format "%s" ];
- より詳しくは、[[Lang/Tcl_Tk_Expect/time]] へ。
////////////////////////////////////////////////////////////////////////////////
* expect [#f32570ee]
** シグナルを受け取った時の処理 [#q1278609]
- bashのシェルスクリプトのように、"trap" コマンドを使う。
- 詳しいことは、[[expect の manpage>http://www.linux.or.jp/JM/html/expect/man1/expect.1.html]] にも書かれているので参照のこと。
書式: trap [[command] signals]
- 次の例では、シグナルを受け取った時に、終期化処理を行う "terminate" 関数を定義し、それを呼び出すようにしている。
proc terminate { } {
# 例えば、ログ取得を終わらせる、とか。
log_file;
}
trap terminate {SIGINT SIGTERM}
** log の取得 [#n927a8bf]
- "log_file" コマンドとシグナルを利用すると結構便利に使える。
- 下記は、"interact" で制御をユーザに引き渡した後、 Ctrl-a でログ取得開始、Ctrl-b でログ取得終了となるようにした例。
proc LogStart { logfile } {
log_file ${logfile};
puts "Logging Start: ${logfile}\r;
}
proc LogStop { } {
puts "Logging Stop\r";
log_file;
}
# 処理を色々記述。
set CTRLA \001
set CTRLB \002
interact {
${CTRLA} { LogStart ${out_log}; }
${CTRLB} { LogStop; }
}
////////////////////////////////////////////////////////////////////////////////
* 参考リンク [#laeb8a5b]
- [[もっとTcl/Tk>http://www.interq.or.jp/japan/s-imai/tcltk/index.html]]