※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。
アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね!
というわけで
TTLメーカーサンプルを見てください。
シェルコマンド行をTeratermマクロで自動実行するには、sendln関数に文字列を渡して記述する。
echo "Michael Jackson knows we sad. but we can not heal him"
であれば、マクロファイルには次のように書く。
sendln 'echo "Michael Jackson knows we sad. but we can not heal him"'
ここで気をつけるのは引用符だ。
sendln "echo "Michael Jackson knows we sad. but we can not heal him""
と書くと、マクロは
"echo "の後ろの二重引用符を文字列リテラルの終了と解釈するので、それに続くMichael~はマクロソースとして解釈できませんという構文エラーになる。
リテラルとはソースコード中の定数のことで、多くの言語では文字列を引用符で囲んで範囲を指定する。TTLマクロも「'」と「"」を使用するので、上の問題が起こらないように使用する。
しかし、下のように1行内に両方の引用符が使われているケースでは、
MJ="Michael Jackson knows we sad. but we can not heal him"
echo "$MJ" |grep 'we' |egrep "[MJ]"
sendln 'echo "$MJ" |grep 'we' |egrep "[MJ]"'
sendlnに渡す文字列の範囲を指定しようがなくなるので使えなくなってしまう。
こういうときは、文字列に改行文字を付加しないもう一つの関数、sendを使って下のように書けば大丈夫だ。
send 'echo "$MJ" |grep '
send "'we'"
send ' |egrep "[MJ]"'
send #10
最後の#10は改行のLFで、TeraTerm画面上では元のコマンドそのままに
echo "$MJ" |grep 'we' |egrep "[MJ]"
と実行される。
しかし、こんなことを手でシコシコやっていては日が暮れてしまう。自動化する方法はないか?ということで作ってみた。面白かったのは、文字列を引用符ごとに切った配列のインデックスが偶数か奇数かどうかでsendで使うべき引用符が「'」と「"」のどっちを使うのか処理できてしまうところだった。というわけで
続きは次回。