Lang/Tcl_Tk_Expect
の編集
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
App
App/archiver
App/audio
App/audio/audacity
App/audio/mpg321
App/audio/puddletag
App/base64
App/Browser
App/column
App/diff-patch
App/downloader
App/ffmpeg
App/ffprobe
App/find
App/gimp
App/gnuplot
App/ImageMagick
App/info
App/inxi
App/LibreOffice
App/locate
App/md5
App/Music
App/Music/frescobaldi
App/Music/MuseScore
App/OCR
App/od
App/OpenOffice.org
App/pagers
App/pdf
App/QRコード
App/ripgrep
App/screen
App/script
App/sed
App/selenium
App/signal-desktop
App/skype
App/sylpheed
App/tmux
App/ttyrec
App/uniq
App/UUID
App/wget
App/xargs
App/テキスト処理
App/仮想化
App/仮想化/Docker
App/仮想化/qemu
App/仮想化/webos
AutoTicketLinkName
BracketName
CentOS
CentOS/yum
CrossCompile
Debian
Debian/kernel
Debian/kernel/ver8-or-older
Debian/Plan9関連
Debian/ver5
Debian/ver6
Debian/ver7
Debian/ver8
Debian/ver9
Debian/ver10
Debian/ver11
Debian/ver12
Debian/X
Debian/X/日本語
Debian/パッケージ管理
Deveice/Sensor/MotionSensor
Device
Device/Mouse
Device/Net/wifi
Device/Scanner
Device/Sensor
Device/Sensor/MotionSensor
Device/tty
Device/xmodmap
Editor
Editor/atom
Editor/binary
Editor/binary/beav
Editor/binary/hexedit
Editor/emacs
Editor/emacs/clang-format
Editor/emacs/flycheck
Editor/emacs/gdb-mode
Editor/emacs/github/copilot
Editor/emacs/html-mode
Editor/emacs/lisp
Editor/emacs/lsp-mode
Editor/emacs/markdown-mode
Editor/emacs/neotree
Editor/emacs/package-install
Editor/emacs/sdic
Editor/emacs/speedbar
Editor/emacs/XEmacs
Editor/emacs/ローカルビルド
Editor/emacs/多言語
Editor/fte
Editor/vi
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
iPhone
Lang
Lang/C++
Lang/C++/Boost
Lang/C++/C++11
Lang/C++/C++11/thread
Lang/C++/C++11/コンテナ
Lang/C++/C++11/コンテナ/string
Lang/C++/C++11/初期化子
Lang/C++/C++17
Lang/C++/C++20
Lang/C++/error
Lang/C++/macro
Lang/C++/template
Lang/C++/コンテナ
Lang/C++/処理系
Lang/C-Sharp
Lang/Go
Lang/html
Lang/html/5
Lang/html/5/canvas
Lang/html/css
Lang/Java
Lang/Java/jar
Lang/Objective-C
Lang/Pascal
Lang/Perl
Lang/Perl/CGI
Lang/Perl/thread
Lang/Perl/utf-8
Lang/pike
Lang/Python
Lang/Python/Class
Lang/Python/Error
Lang/Python/import対象パス
Lang/Python/pip
Lang/Python/基本文法
Lang/Python/開発環境
Lang/Rust
Lang/sed
Lang/shell
Lang/shell/bash
Lang/shell/bash/設定
Lang/shell/bash/設定/command-not-found
Lang/Tcl_Tk_Expect
Lang/Tcl_Tk_Expect/Ctrl-キーマップ
Lang/TypeScript
Lang/xml
Mac
Memo
memo
MenuBar
midi
Multimedia
Net
Net/apache
Net/apache2
Net/dig
Net/dns/server
Net/domain
Net/http/アクセス制御
Net/iptables
Net/IRC
Net/Jenkins
Net/lighttpd
Net/mail
Net/mail/X-Face
Net/news
Net/news/gnus
Net/ntp
Net/pukiwiki
Net/pukiwiki/plugin
Net/resolv.conf
Net/SPAM
Net/ss
Net/tcpdump
Net/traceroute
Net/twitter
Net/vpn
Net/web
Net/webAPI
Net/wifi
Net/wifi/AP
Net/監視
otherlinks
PHP
Plan9
PPC
PPC/LinuxPPC
PPC/MkLinux
Prog
Prog/AI
Prog/autotools
Prog/cmake
Prog/Compiler/gcc
Prog/CrossReferencer
Prog/debug
Prog/debug/gdb
Prog/debug/lldb
Prog/debug/ltrace
Prog/debug/memory
Prog/debug/strace
Prog/formatter/clang-format
Prog/GoogleTest
Prog/Gtk
Prog/IDE
Prog/IDE/Geany
Prog/ldd
Prog/make
Prog/nm
Prog/Profiler
Prog/Qt
Prog/readelf
Prog/Sound
Prog/StaticCodeAnalysis
Prog/StaticCodeAnalysis/cppcheck
Prog/strip
Prog/TagSystem
Prog/TagSystem/cscope
Prog/TagSystem/ctags-exuberant
Prog/TagSystem/ebrowse
Prog/TagSystem/etags
Prog/TagSystem/gtags
Prog/TagSystem/id-utils
Prog/TagSystem/lctags
Prog/TagSystem/rtags
Prog/TagSystem/SilentBob
Prog/X/X11
Prog/プロセス間通信
Prog/プロセス間通信/SharedMemory
Prog/プロセス間通信/singal
Prog/人為的なシグナル
Prog/分散ビルド/distcc
Prog/逆アセンブル
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
RS232C
SandBox
Security
Security/aide
Security/chkrootkit
Security/clamav
Security/gpg
Security/pkcs
Security/ssh
Security/test
Security/パスワード解析
System
System/Audio
System/beep
System/bluetooth
System/cpu
System/dm-crypt
System/fs
System/fs/ext2-3
System/fs/mount
System/fs/nfs
System/fs/tmpfs
System/fs/xfs
System/fs/大容量のファイルを高速に作成する
System/fs/強制物理フォーマット
System/grub
System/Hardware情報
System/HDD/IDE/チューニング
System/input
System/iostat
System/Kernel
System/Kernel/Module
System/locale
System/memory
System/OpenCL
System/os
System/power/battery
System/Process
System/random
System/rpm
System/runlevel
System/signal
System/sudo
System/swap
System/USB-Boot
System/user
System/シリアル接続
System/環境変数
TeX
TeX/MusiXTeX
tools
Top/Editor/emacs/python開発環境
transcription/old
Ubuntu
VersionCtl
VersionCtl/git
VersionCtl/git/Gerrit
VersionCtl/git/Gerrit/old
VersionCtl/git/git-gutter+
VersionCtl/git/git-imerge
VersionCtl/git/magit
VersionCtl/git/magit/2.1.0
VersionCtl/git/magit/2.8.0
VersionCtl/git/magit/2.13.1
VersionCtl/git/magit/v3.2.1
VersionCtl/git/magit/v3.3.0
VersionCtl/git/subversion からの移行
VersionCtl/git/subversion とのコマンド対比
VersionCtl/git/tig
VersionCtl/git/統計
VersionCtl/hg
VersionCtl/Mercurial
VersionCtl/repo
VersionCtl/Subversion
WikiEngines
WikiName
WikiWikiWeb
Windows
Windows/cmd
X
X/DisplayManager
X/DisplayManager/gdm3
X/DisplayManager/lightdm
X/font
X/font/old
X/GNOME3
X/input
X/input/OnScreenKeyboard
X/input/キーアサインを変更する
X/input/グラゴル文字
X/input/日本語
X/input/日本語/ATOK X3
X/input/日本語/ibus
X/input/日本語/uim
X/KDE
X/remote
X/screensaver
X/terminal
X/terminal/mlterm
X/terminal/urxvt
X/terminal/uxterm
X/vnc
X/vnc/tigervnc
X/WindowManager
X/WindowManager/9wm
X/WindowManager/amiwm
X/WindowManager/awesome
X/WindowManager/CDE
X/WindowManager/cinnamon
X/WindowManager/dwm
X/WindowManager/flwm
X/WindowManager/i3
X/WindowManager/jwm
X/WindowManager/matchbox
X/WindowManager/MATE
X/WindowManager/mlvwm
X/WindowManager/qvwm
X/WindowManager/ratpoison
X/WindowManager/ude
X/WindowManager/WindowMaker
X/WindowManager/xfce4
X/xdotool
X/Xnest
X/xrdp
X/xvfb
YukiWiki
スタジオ・ホール
旅
旅/Czech
旅/三重
旅/京都・滋賀
旅/兵庫
旅/千葉
旅/各務
旅/和歌山
旅/埼玉
旅/山形
旅/岐阜
旅/岡山
旅/岩手
旅/島根
旅/愛媛
旅/新潟
旅/東京
旅/栃木
旅/神奈川
旅/秋田
旅/群馬
旅/茨城
旅/長野・山梨
旅/静岡
旅/静岡/伊豆
未整理
食
食/チェコ
食/各国
食/料理
食/激辛
食/蕎麦
食/郷土料理
#topicpath * 目次 [#kd018898] #contents //////////////////////////////////////////////////////////////////////////////// * 共通 [#udbf4d6a] ** コメント [#m841fda8] -- "#" 以降がコメントになる -- 式を書いた後にコメントを書く場合、 "#" の前に ";" がないとエラーになるので注意 //////////////////////////////////////////////////////////////////////////////// ** I/O [#k5fe58b5] - 定義済みの channel_ID: stdout / stderr / stdin - 出力 -- puts [-nonewline] channel_ID string --- defalut では stdout へ出力する。 --- -nonewline オプションをつけると、改行文字を省略する。 --- 例 puts stderr "ERROR: an error has occuered\r"; # stderr に文字列を出力。 - 入力 -- gets gets stdin VAL; # 変数 VAL に、stdin から読み取った内容を格納する。 -- read [-nonewline] channel_ID --- channel_ID から全てのデータを読み込む。 --- -nonewline オプションをつけると、改行文字を省略する。 -- read channel_ID bytes --- channel_ID から、bytes 分のデータを読み込む。 -- seek channel_ID offset [origin] --- originは、以下が定義されている: |~origin |~description | |start |ファイルやデバイスの先頭から | |current |現在のアクセス位置 | |end |ファイルやデバイスの終端から | -- tell channel_ID --- channel_ID の、現在のアクセス位置を返す。 //////////////////////////////////////////////////////////////////////////////// ** 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.expとする)から、別のスクリプトファイル(script-sub.expとする)の中身を取り込みたいときは、以下のように記述する: source "script-sub.exp"; -- これにより、script-sub.exp の定義内容が、元からscript-main.expに書かれていたかのように扱える。 //////////////////////////////////////////////////////////////////////////////// ** フロー制御 [#hb9d792c] *** if [#lf2b9949] set i 10; set EXP 20; if { ${i} > ${EXP} { 処理... } elseif { ${i} == ${EXP} } { 処理... } else { 処理... } - if 条件文内の or/and は、C/C++ 等と同様、 "||" "&&" で列挙する。 - 動かない例: 「 } elseif { } { 」ではなく「 elseif { } {」 if { ${i} > ${EXP} } { 処理... } elseif { ${i} == ${EXP} } { 処理... } else { 処理... } *** for [#q0f54d72] set LOOP_MAX 100; for { set i } { ${i} < ${LOOP_MAX} } { incr i } { 処理... } *** foreach [#xdb5adc3] - 例1 foreach i { 0 1 2 3 4 5 } { 処理... } - 例2 foreach { i j } { 0 1 2 3 4 5 } { 処理... } - 例3 foreach i { 0 1 2 3 4 5 } j { 0 10 20 30 40 50 } { 処理... } *** while [#j842bed1] while { ${i} >= ${VAL} } { 処理... } *** ループ制御の補助コマンド [#e483400d] |~command |~description | |continue | ループをスキップ。| |break | ループを終了 | |exit [ return_code ] |return_code は、default では0 | *** switch [#fd207646] switch [options] ${string} { pattern_1 { 処理... } pattern_2 { 処理... } ... default { 処理... } } - options |~option |~description | |-exact | string と pattern が完全に一致する場合に真となる | |-glob | string をグロブパターン pattern とマッチング | |-regexp| string を正規表現 pattern とマッチング | |-- | option 終了を示す | - option 無しの場合、値 1 と 値 01 は、別物として識別される。 - 上記文例における ${string} は''あくまで文字列''で、数値として扱うと期待通りに pattern_* にマッチしない。 //////////////////////////////////////////////////////////////////////////////// ** 時間 [#md0caab7] - 現在時間の取得 set time_stamp [ clock seconds ]; # clock clicks -milliseconds ではダメ。 - 上記で取得した時間の値 time_stamp を書式化して、time に格納する。 set time [ clock format ${time_stamp} -format {%s} ]; set time [ clock format ${ts} -format {%Y-%m-%d %H:%M:%S} ]; # YYYY-MM-DD hh:mm:ss - より詳しくは、[[Lang/Tcl_Tk_Expect/time]] へ。 *** 経過時間の計測 [#x561d74a] - "-milliseconds" オプションを付けると、msecオーダーの精度が保証される。 # 経過時間計測 # 1. GetWrapTimeInit で start_ts を取得。 # 2. GetWrapTime を、 start_ts を渡して呼ぶと、現在時間との差分を返す。 proc GetWrapTimeInit { } { set start_ts [ clock clicks -milliseconds ]; set start_ts [ clock format ${start_ts} -format {%s} ]; return ${start_ts}; } proc GetWrapTime { start_ts } { set ts [ clock clicks -milliseconds ]; set ts [ clock format ${ts} -format {%s} ]; set wrap [ expr ${ts} - ${start_ts} ]; return ${wrap}; } //////////////////////////////////////////////////////////////////////////////// ** 変数の名前と値の取得 [#pd90a3f5] - info コマンドを使う - global 変数名を取得 書式: [ info globals ?option? ] set gloval_val [ info globals ]; # 全てのglobal 変数の変数名リストが出来る。 puts "${gloval_val}"; -- ?option? で文字列を指定すると、それに一致するものだけがリストに格納される(デフォルトは *) set global_val [ info globals *_library ]; # '_library' で終わる名前の全てのglobal変数が格納される。 - 変数名リストに格納された変数の「値」を知るには、for 文などで変数名リストを回して、それぞれの値を得る set num [ llength ${val_names} ]; # 変数名リスト val_names の要素数を得る for { set i 0 } { ${i} < ${num} } { set i [ incr i ] } { set val_name [ lindex ${val_names} ${i} ]; # set val_val [ eval "set \$\{${val_name}\}" ]; # 間違い例:こんなことは出来ない。 # set val_val ${${val_name}}; # 間違い例:こんなことは出来ない。 set val_val [ set ${val_name} ]; # これで値が取得出来る。 puts "\[name:${val_name}\]\[val:${val_val}\]\r"; # 表示 } //////////////////////////////////////////////////////////////////////////////// * expect [#f32570ee] ** 基本 [#ca535d79] + 相手にするプログラムを呼び出す + expect で、期待するキーワード(プロンプト文字列や、エラーメッセージの一部など)を指定する。 + 期待するキーワードが来たときに、人に代わって入力するコマンド等を send で送る。 - 例:bashを起動し、カレントディレクトリのファイル一覧を表示する #!/usr/bin/expect spawn bash; # 相手にするプログラムの一例として、ここでは bashを指定 expect "\\$" { # プロンプト文字列が "$" の場合は、こうなる(ちょっとややこしいが) send "ls -l\r"; # ユーザがTREURNキーを押すのに対応するものとして、コマンド文字列終端に改行 "\r" が必要。 } //////////////////////////////////////////////////////////////////////////////// ** interact :ユーザのマニュアル操作も組み合わせる [#e0fec1ca] #!/usr/bin/expect spawn bash; expect "\\$" { send "ping www.example.com\r"; } interact; # ユーザーに処理を渡す - ユーザのマニュアル操作も組み合わせる2:Ctrl-a を押すと、指定された処理を行う ・・・ set CTRL_A "\001"; interact { ${CTRL_A} { puts "typed Ctrl-a!!\r"; 処理... } } //////////////////////////////////////////////////////////////////////////////// ** [[Ctrl-* キーの割り当て>Lang/Tcl_Tk_Expect/Ctrl-キーマップ]] [#cb0ce827] - リンク先のように定義してやれば、Ctrl-a と打ったときのアサインに使用出来る。 //////////////////////////////////////////////////////////////////////////////// ** timeout [#m636720b] - "expect" で待つときのタイムアウトは、変数 timeout に設定する。defaultでは10sec set timeout -1; # -1 にすると、タイムアウトしなくなる。 *** タイムアウトやキーワード以外の条件を考慮した待ち方をしたいときの例 [#s2bb5fb2] set timeout 1; while {1} { # 基本的には無限待ち expect "KEYWORD" { 処理; break; # この処理が終わったら、whileループを抜ける } if { 条件 } { # timeout する度にこの条件がチェックされる break; # 場合によっては無限待ちループを抜ける } } //////////////////////////////////////////////////////////////////////////////// ** expect [#cf2dedcd] *** 複数のキーワードを受け付け、キーワードによって挙動を変えたい場合 [#e6ccd01b] expect { "KEYWORD1" { 処理1; } "KEYWORD2" { 処理2; } } - エラー発生時にはエラーメッセージを出力して再度正常時と同様にプロンプトを表示するようなプログラムが相手の場合、プロンプト文字列(正常時処理用に待つキーワード)は一番最後に列挙する。 //////////////////////////////////////////////////////////////////////////////// ** シグナルを受け取った時の処理 [#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 でログ取得終了となるようにした例。C-c, C-d でSIGNALを受信し、ログファイルを close した上で終了する。 proc LogStart { logfile } { log_file ${logfile}; puts "Logging Start: ${logfile}\r; } proc LogStop { } { puts "Logging Stop\r"; log_file; } proc terminate { } { LogStop; exit 0; } trap terminate {SIGINT SIGTERM} # 処理を色々記述。 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]]
#topicpath * 目次 [#kd018898] #contents //////////////////////////////////////////////////////////////////////////////// * 共通 [#udbf4d6a] ** コメント [#m841fda8] -- "#" 以降がコメントになる -- 式を書いた後にコメントを書く場合、 "#" の前に ";" がないとエラーになるので注意 //////////////////////////////////////////////////////////////////////////////// ** I/O [#k5fe58b5] - 定義済みの channel_ID: stdout / stderr / stdin - 出力 -- puts [-nonewline] channel_ID string --- defalut では stdout へ出力する。 --- -nonewline オプションをつけると、改行文字を省略する。 --- 例 puts stderr "ERROR: an error has occuered\r"; # stderr に文字列を出力。 - 入力 -- gets gets stdin VAL; # 変数 VAL に、stdin から読み取った内容を格納する。 -- read [-nonewline] channel_ID --- channel_ID から全てのデータを読み込む。 --- -nonewline オプションをつけると、改行文字を省略する。 -- read channel_ID bytes --- channel_ID から、bytes 分のデータを読み込む。 -- seek channel_ID offset [origin] --- originは、以下が定義されている: |~origin |~description | |start |ファイルやデバイスの先頭から | |current |現在のアクセス位置 | |end |ファイルやデバイスの終端から | -- tell channel_ID --- channel_ID の、現在のアクセス位置を返す。 //////////////////////////////////////////////////////////////////////////////// ** 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.expとする)から、別のスクリプトファイル(script-sub.expとする)の中身を取り込みたいときは、以下のように記述する: source "script-sub.exp"; -- これにより、script-sub.exp の定義内容が、元からscript-main.expに書かれていたかのように扱える。 //////////////////////////////////////////////////////////////////////////////// ** フロー制御 [#hb9d792c] *** if [#lf2b9949] set i 10; set EXP 20; if { ${i} > ${EXP} { 処理... } elseif { ${i} == ${EXP} } { 処理... } else { 処理... } - if 条件文内の or/and は、C/C++ 等と同様、 "||" "&&" で列挙する。 - 動かない例: 「 } elseif { } { 」ではなく「 elseif { } {」 if { ${i} > ${EXP} } { 処理... } elseif { ${i} == ${EXP} } { 処理... } else { 処理... } *** for [#q0f54d72] set LOOP_MAX 100; for { set i } { ${i} < ${LOOP_MAX} } { incr i } { 処理... } *** foreach [#xdb5adc3] - 例1 foreach i { 0 1 2 3 4 5 } { 処理... } - 例2 foreach { i j } { 0 1 2 3 4 5 } { 処理... } - 例3 foreach i { 0 1 2 3 4 5 } j { 0 10 20 30 40 50 } { 処理... } *** while [#j842bed1] while { ${i} >= ${VAL} } { 処理... } *** ループ制御の補助コマンド [#e483400d] |~command |~description | |continue | ループをスキップ。| |break | ループを終了 | |exit [ return_code ] |return_code は、default では0 | *** switch [#fd207646] switch [options] ${string} { pattern_1 { 処理... } pattern_2 { 処理... } ... default { 処理... } } - options |~option |~description | |-exact | string と pattern が完全に一致する場合に真となる | |-glob | string をグロブパターン pattern とマッチング | |-regexp| string を正規表現 pattern とマッチング | |-- | option 終了を示す | - option 無しの場合、値 1 と 値 01 は、別物として識別される。 - 上記文例における ${string} は''あくまで文字列''で、数値として扱うと期待通りに pattern_* にマッチしない。 //////////////////////////////////////////////////////////////////////////////// ** 時間 [#md0caab7] - 現在時間の取得 set time_stamp [ clock seconds ]; # clock clicks -milliseconds ではダメ。 - 上記で取得した時間の値 time_stamp を書式化して、time に格納する。 set time [ clock format ${time_stamp} -format {%s} ]; set time [ clock format ${ts} -format {%Y-%m-%d %H:%M:%S} ]; # YYYY-MM-DD hh:mm:ss - より詳しくは、[[Lang/Tcl_Tk_Expect/time]] へ。 *** 経過時間の計測 [#x561d74a] - "-milliseconds" オプションを付けると、msecオーダーの精度が保証される。 # 経過時間計測 # 1. GetWrapTimeInit で start_ts を取得。 # 2. GetWrapTime を、 start_ts を渡して呼ぶと、現在時間との差分を返す。 proc GetWrapTimeInit { } { set start_ts [ clock clicks -milliseconds ]; set start_ts [ clock format ${start_ts} -format {%s} ]; return ${start_ts}; } proc GetWrapTime { start_ts } { set ts [ clock clicks -milliseconds ]; set ts [ clock format ${ts} -format {%s} ]; set wrap [ expr ${ts} - ${start_ts} ]; return ${wrap}; } //////////////////////////////////////////////////////////////////////////////// ** 変数の名前と値の取得 [#pd90a3f5] - info コマンドを使う - global 変数名を取得 書式: [ info globals ?option? ] set gloval_val [ info globals ]; # 全てのglobal 変数の変数名リストが出来る。 puts "${gloval_val}"; -- ?option? で文字列を指定すると、それに一致するものだけがリストに格納される(デフォルトは *) set global_val [ info globals *_library ]; # '_library' で終わる名前の全てのglobal変数が格納される。 - 変数名リストに格納された変数の「値」を知るには、for 文などで変数名リストを回して、それぞれの値を得る set num [ llength ${val_names} ]; # 変数名リスト val_names の要素数を得る for { set i 0 } { ${i} < ${num} } { set i [ incr i ] } { set val_name [ lindex ${val_names} ${i} ]; # set val_val [ eval "set \$\{${val_name}\}" ]; # 間違い例:こんなことは出来ない。 # set val_val ${${val_name}}; # 間違い例:こんなことは出来ない。 set val_val [ set ${val_name} ]; # これで値が取得出来る。 puts "\[name:${val_name}\]\[val:${val_val}\]\r"; # 表示 } //////////////////////////////////////////////////////////////////////////////// * expect [#f32570ee] ** 基本 [#ca535d79] + 相手にするプログラムを呼び出す + expect で、期待するキーワード(プロンプト文字列や、エラーメッセージの一部など)を指定する。 + 期待するキーワードが来たときに、人に代わって入力するコマンド等を send で送る。 - 例:bashを起動し、カレントディレクトリのファイル一覧を表示する #!/usr/bin/expect spawn bash; # 相手にするプログラムの一例として、ここでは bashを指定 expect "\\$" { # プロンプト文字列が "$" の場合は、こうなる(ちょっとややこしいが) send "ls -l\r"; # ユーザがTREURNキーを押すのに対応するものとして、コマンド文字列終端に改行 "\r" が必要。 } //////////////////////////////////////////////////////////////////////////////// ** interact :ユーザのマニュアル操作も組み合わせる [#e0fec1ca] #!/usr/bin/expect spawn bash; expect "\\$" { send "ping www.example.com\r"; } interact; # ユーザーに処理を渡す - ユーザのマニュアル操作も組み合わせる2:Ctrl-a を押すと、指定された処理を行う ・・・ set CTRL_A "\001"; interact { ${CTRL_A} { puts "typed Ctrl-a!!\r"; 処理... } } //////////////////////////////////////////////////////////////////////////////// ** [[Ctrl-* キーの割り当て>Lang/Tcl_Tk_Expect/Ctrl-キーマップ]] [#cb0ce827] - リンク先のように定義してやれば、Ctrl-a と打ったときのアサインに使用出来る。 //////////////////////////////////////////////////////////////////////////////// ** timeout [#m636720b] - "expect" で待つときのタイムアウトは、変数 timeout に設定する。defaultでは10sec set timeout -1; # -1 にすると、タイムアウトしなくなる。 *** タイムアウトやキーワード以外の条件を考慮した待ち方をしたいときの例 [#s2bb5fb2] set timeout 1; while {1} { # 基本的には無限待ち expect "KEYWORD" { 処理; break; # この処理が終わったら、whileループを抜ける } if { 条件 } { # timeout する度にこの条件がチェックされる break; # 場合によっては無限待ちループを抜ける } } //////////////////////////////////////////////////////////////////////////////// ** expect [#cf2dedcd] *** 複数のキーワードを受け付け、キーワードによって挙動を変えたい場合 [#e6ccd01b] expect { "KEYWORD1" { 処理1; } "KEYWORD2" { 処理2; } } - エラー発生時にはエラーメッセージを出力して再度正常時と同様にプロンプトを表示するようなプログラムが相手の場合、プロンプト文字列(正常時処理用に待つキーワード)は一番最後に列挙する。 //////////////////////////////////////////////////////////////////////////////// ** シグナルを受け取った時の処理 [#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 でログ取得終了となるようにした例。C-c, C-d でSIGNALを受信し、ログファイルを close した上で終了する。 proc LogStart { logfile } { log_file ${logfile}; puts "Logging Start: ${logfile}\r; } proc LogStop { } { puts "Logging Stop\r"; log_file; } proc terminate { } { LogStop; exit 0; } trap terminate {SIGINT SIGTERM} # 処理を色々記述。 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]]
テキスト整形のルールを表示する