エスケープ文字


エスケープ文字

Tera Term マクロに限らずプログラムではエスケープ文字を利用したくなる場面があります。

例えば、シェルで改行文字をエスケープすると、内容によっては長くなってしまう1行も、適切に改行することで見やすいスクリプトになります。
$ cat sample.sh
#!/bin/bash
the_first_value="5"
the_second_value="6"
printf "This sample calculation message %s + %s = %s\n" \
  ${the_first_value} \
  ${the_second_value} \
  $((the_first_value + the_second_value))
$ bash sample.sh
This sample calculation message 5 + 6 = 11
例えば、括り文字 (シングルクォーテーション ' や、ダブルクォーテーション " のこと)をエスケープすると、括り文字の中で括り文字を扱うことができます。
$ echo "This is \"double Quotation\" sample"
This is "double Quotation" sample

結論

結論を言うと、現時点*1において Tera Term にエスケープ文字はありません。

*1 : Tera Term バージョン 4.103

代替方法

エスケープする方法がないため、上記の使用例に対する代替案を記します。

ASCII コードを直指定

括り文字の中に括り文字を利用する場合は、ASCII コードを直に指定する方法があります。
指定方法
ASCII コードを利用
Tera Term で ASCII コードを指定するには、文字に割り振られた番号に # を付与します。

'#' で数値が記述場合、10進数 (0~9) での指定です。
'#$' で数値が記述されている場合、16進数 (0~F) での指定です。

たとえば Tera Term で文字 A を指定する場合、10進数では #65 を、16進数では #$41 を記述します。
ASCII コードで指定可能な文字については ASCII コード を参照してください。
制御文字/印字可能文字に関わらず指定可能です。

・ASCII コードでの代替指定
sprintf "This is "#34"double quotation"#$22
messagebox inputstr 'message test'
ASCII コードでの指定

クォーテーションの種類を変える
厳密にいうと代替方法ではありませんが、シングルクォーテーションの中でダブルクォーテーションを利用することは可能です。
sprintf 'This is "double quotation"'
messagebox inputstr 'message test'
制限事項
上述のような ASCII コード指定する場合は、クォーテーションの中に入れることができません。

・ASCII コードの指定をミスしている例
sprintf "This is #34double quotation"#$22
messagebox inputstr 'message test'
クォートを指定ミスしている例


また、一連の文字列にはスペースを入れることができません。

・ASCII コードが反映されない例
sprintf "This is " #34 "double quotation"#$22
messagebox inputstr 'message test'
反映されない例


スペースも ASCII コードで指定可能なので、以下のように記述します。

・スペース文字を指定した例
sprintf "This is"#32#34"double quotation"#34
messagebox inputstr 'message test'

strconcat

文字列を、何列かに分けて組み立てたい場合は strconcat を利用することで代替できるかもしれません。

もともと strconcat を使っているものを sprintf2 に代替したものが Linux SSH ですが、逆に sprintf2 を strconcat で分解する方法としても参考になると思います。

マクロのオプション

2021/05/18 05:51 Macro::macro 仕様

マクロのオプション

ttpmacro.exe にはオプションが指定可能です。

Tera Term バージョン 4.92 から、以下の仕様になっています。

コマンドラインオプション

Tera Term マクロには、コマンドラインオプションを指定することができます。

指定方法は、以下の通りです。
TTPMACRO.EXE [/I] [/V] [<macro file> [<parameters>...]]
[/I]
マクロ起動時に、マクロをアイコン化します。

[<macro file>] より後に記述された場合は、マクロファイルのオプションとして扱われます。
また、拡張子 .ttl のマクロファイルから ttpmacro.exe を起動した場合は、このオプションは省略されたものとして扱われます。
[/V]
マクロ起動時に、マクロを隠します。

[<macro file>] より後に記述された場合は、マクロファイルのオプションとして扱われます。
また、拡張子 .ttl のマクロファイルから ttpmacro.exe を起動した場合は、このオプションは省略されたものとして扱われます。
[<macro file>]
マクロファイル名を指定します。

ファイル名が絶対パスでないときは、ttpmacro.exe からの相対パスと見なされます。
ファイル名はディレクトリ情報が取り除かれ、システム変数 param1 および params[1] に格納されます。

param1 は文字列型ですが、params[1] は文字列型配列になっています。
[<macro file> [<parameters>...]]
[<macro file>] 以降のパラメータは、マクロファイルへ渡したい情報を指定します。

これらはシステム変数 param2 ~ param9 に格納されます。
param10 以降に相当する変数は存在しません。

また、params[2](文字列型配列 params の 3 番目の要素)から順番に格納されます。
文字列型配列であるため、理論的には params[10] 以降は 65536 まで指定可能と思われます。

Windows Vista 以降のコマンドプロンプトでは、以下の制約が存在します。
Windows Vista 以降の コマンド プロンプト (Cmd.exe) では、8192 文字以上の引数を受け付けられますが、8192 文字以上の引数を渡した場合には、以下の現象が発生する可能性があります。

・echo コマンドで、8192 文字目以降の引数が切り捨てられる。
・cmd.exe から、子プロセスを起動する際、渡される引数の一部に抜けが生じる。
https://support.microsoft.com/ja-jp/help/2823587
文字列型も文字列型配列も、最長 511 文字まで指定可能です。

備考

ラベルを用いたサブルーチン (call) や、別ファイルを呼び出すインクルード(include)には、オプションを指定することができません。

エラーメッセージ

2021/05/18 05:59 Macro::macro 仕様

エラー出力

エラー用サンプル

Tera Term のエラーメッセージ出力用に、以下のサンプルを実行しました。

ファイル名:err.ttl
unknowncmd 'test'

ダイアログボックス

Tera Term マクロを実行していて、仕様に沿わない記述等があるとサンプルのようなダイアログボックスが出力されます。

Unknown command
表示されるダイアログボックスの例

出力情報の説明

上記ダイアログボックスに番号を付与して、出力情報を説明します。

Unknown command guide
説明用番号を付与したダイアログボックス

対照表
該当番号表示内容出力情報の意味
unknown commandエラーメッセージです。
意味は、下のエラーメッセージ表を参照してください。
err.ttl:1.該当マクロファイル名と、エラー対象の行番号です。
<<<unknowncmd '>>>test'<<< >>> で囲われた部分がエラーメッセージの対象です。
マクロ停止(S)実行中マクロの停止ボタンです。
続行(C)実行中マクロの続行ボタンです。
ヘルプ(H)ヘルプを表示します。

サンプルエラーの要約

上記の内容から、ダイアログボックスは次のようにエラーを報告しています。
現在の Tera Term バージョンではサポートされていないコマンドを使ってない?
エラー対象は err.ttl の 1 行目にある unknowncmd だよ。

マクロの実行について、停止するか、続行するか、ヘルプを参照するか選んでね。

エラーメッセージ

以下 Tera Term が出力するエラーメッセージと、その意味になります。
Tera Term エラーメッセージ
エラーメッセージ意味
Can't call sub.サブルーチンを呼べない。
サブルーチンは別のファイルにある。
Can't link macro.MACRO と Tera Term の間のリンクに失敗。
Can't open file.インクルードファイルが存在しないか、インクルードの階層が深すぎる。
")" expected.カッコが閉じていない。
"*/" expected.コメントが閉じていない。
Link macro first. Use 'connect' macro.MACRO と Tera Term の間のリンクが確立してないため、コマンドが実行できない。
Divide by zero.0で割ろうとした。
Invalid control."else", "elseif", "endif" の誤った使用。
Label already defined.ラベル名の多重使用。
Label required.ラベルが見つからない。
Stack overflow.サブルーチン、"for-next" ループ、"while-endwhile" の階層が深すぎる。
Syntax error.コマンドの形式が間違っている。
Too many labels.ラベルの数が多すぎる。
(最大512個)
Too many variables.変数の数が多すぎる。
(整数型、文字列型、整数配列型、文字列配列型それぞれ最大256個ずつ)
Type mismatch.定数または変数の型が間違っている。
Variable not initialized.初期化されてない変数を参照した。
Index out of range.定義された配列変数の要素数を超えるインデックスを参照した。
"]" expected.配列のカッコ "]" が閉じていない。
Can't allocate memory.メモリの確保に失敗。
Unknown command.マクロコマンドは現在のTera Termバージョンではサポートされていない。

文字・数字の表現(定数)

2021/05/18 05:26 Macro::macro 仕様

文字と数字の表し方

Tera Term マクロにおいて、文字や数字を表現するのに、定数と言う言葉を用いています。
C言語における定数が、データの種類と書き方を表しているので、その流用みたいです。

C 言語の定数 (参考)

C言語における定数としては、以下の書き方をしていました。
データの種類書き方備考
整数12310進数で int 型となっています。
01738進数 (10進数で 123) を表します。
0x7B16進数 (10進数で 123) を表します。
符号なし整数1234u
1234U
long型整数1234l
1234L
実数3.14f
3.14F
double型実数12.3456
文字'a'1 byte 文字を表します。
文字列"a"
"abc"
いずれも文字列として扱います。

Tera Term 言語の定数

Tera Term マクロ言語の定数をまとめると、以下のようになります。
データの種類書き方備考
整数12310進数で int 型となっています。
なお、負の整数は、0-x のように 0 からマイナスするか、一旦変数へ代入して利用します。
$7B16進数 (10進数で 123) を表します。
文字#123# から始まる整数で指定します。
文字 #123 および #$7B は、どちらも ASCII コードにおける { を意味します。
ただし ASCII コード 0 の文字 (NUL) は、文字に含められません。
#$7B
文字列'a'どちらのクォーテーションでも、文字列を表します。
"a"
#123'a'#125いずれも、文字列 {a} を表します。
#$7B'a'#$7D
#123"a"#125
#$7B"a"#$7D
実数-Tera Term において、浮動小数点は未サポートです。

なお、このサイト全体としては、定数を「最初に宣言し、値の変化しない変数」の意味で扱っています。

整数型定数

整数型定数の表現

マクロファイルにおける整数型定数は、10 進数または "$" で始まる16進数で表現します。
Tera Term は、浮動小数点が未サポートです。
例:
    123
    -11
    $3a
    $10F

負の整数定数についての注意

コマンドのパラメータに負の整数定数を使用する場合、以下のような問題が発生する場合があります。

例えば、次のコマンドは文法エラーとなります。
for i -10 0
これは、2番めのパラメータが "i" ではなく、"i-10" とみなされるからです。

この問題を防ぐには以下のいずれかの方法をとります。
  1. "-" の前に "0" をつける。
    for i 0-10 0
    
  1. 負の整数定数を変数に代入してから使用する。
    A = -10
    for i A 0
    

文字列型定数

文字列型定数の表現

Tera Term マクロにおいて文字列型定数を表現する方法は、クォーテーションで文字列を囲んで使用するものと、文字をコードで指定するものの 2 つ存在します。
クォーテーションで文字列を囲む方法
値となる文字列の両端を ' か " で囲みます。
文字列の両端には、同じ文字を使用してください。

文字列を構成する文字は、表示可能で囲み文字と異なる文字ならば何でもかまいません。
例:
    'Hello, world'
    "I can't do that"
    "漢字も可能"
なお、どうしても囲み文字と同じ文字を利用したい場合がありますが、Tera Term では囲み文字を \ 等でエスケープすることができません。
このような時は、ASCII コードと組み合わせて対応します。
詳細は、下記項目「組み合わせ」を参照してください。
文字をコードで指定する方法
1 文字を ASCII (または JIS ローマ字、Shift-JIS) コード (10 進数または $ で始まる 16 進数) で表現し、先頭に "#" をつけます。
ASCII コード 0 の文字 (NUL) は文字列定数に含めることができません。
例:
    #65     文字 "A"
    #$41    文字 "A"
    #13     CR 文字
ASCII コードの各数値は ASCII コード を参照してください。
組み合わせ
「クォーテーションで文字列を囲む方法」と「文字をコードで指定する方法」は、組み合わせることが可能です。
例:
    'cat readme.txt'#13#10
    'abc'#$0d#$0a'def'#$0d#$0a'ghi'
囲み文字とASCIIコードの間に、スペースを入れてしまうとシンタックスエラーになります。


・利用例 1 (シングルクォーテーションを利用する)
msg = 'Single quotation '#39'Used'#39
messagebox msg 'Quotation test'

シングルクォーテーション例
シングルクォーテーション例

シングルクォーテーションは、16進数 (#$27) でも利用可能です。

・利用例 2 (ダブルクォーテーションを利用する)
msg = "Double quotation "#34"Used"#34
messagebox msg 'Quotation test'

ダブルクォーテーション例
ダブルクォーテーション例

ダブルクォーテーションは、16進数 (#$22) でも利用可能です。

・利用例 3 (各種コマンド)
send 'cat /etc/hosts'#13#10

fileopen  fhandle 'c:\test.txt' 
filewrite fhandle '---------cut here---------'#13#10
fileclose fhandle
なお、上記の記述方法は、以下の記述方法と同じになります。
sendln 'cat /etc/hosts'

fileopen    fhandle 'c:\test.txt' 
filewriteln fhandle '---------cut here---------'
fileclose   fhandle

式と演算子

2021/05/18 05:52 Macro::macro 仕様

式と演算子

if 等で扱う条件式は、以下の仕様となっています。

式の表現

式は、定数・変数・演算子・カッコで表現します。

式で扱う定数と変数は、整数型のみです。
結果も整数型になります。

関係演算子を用いた式の結果の値は、以下の通りです。
式の結果値の意味
0
1

演算子の優先順位による分類

優先順位演算子バージョン種類
1
(最高)
notビット否定演算子*1"~" はバージョン 4.53 以降で利用可
~(4.53 以降)
!(4.53 以降)論理否定演算子バージョン 4.53 以降で利用可
+正の単項演算子
-負の単項演算子
2*乗算演算子
/除算演算子
%余剰演算子A % B の値は A / B の余り
3+加算演算子
-減算演算子
4>>(4.54 以降)算術ビットシフト演算子バージョン 4.54 以降で利用可
<<
>>>(4.54 以降)論理ビットシフト演算子バージョン 4.54 以降で利用可
5andビット毎論理積演算子*1"&" はバージョン 4.53 以降で利用可
&(4.53 以降)
6xorビット毎排他的論理和演算子*1"^" はバージョン 4.53 以降で利用可
^(4.53 以降)
7orビット毎論理和演算子*1"|" はバージョン 4.53 以降で利用可
|(4.53 以降)
8<関係演算子
>
<=
>=
9=関係演算子"==" と "!=" はバージョン 4.54 以降で利用可
==(4.54 以降)
<>
!=(4.54 以降)
10&&(4.53 以降)論理積演算子バージョン 4.53 以降で利用可
11
(最低)
||(4.53 以降)論理和演算子バージョン 4.53 以降で利用可

*1 and, or, xor, not はビット演算子です。(論理演算子ではありません)

例:
    1 + 1
    4 - 2 * 3      この式の値は-2
    15 % 10        この式の値は5
    3 * (A + 2)    A は整数型の変数
    A and not B
    A <= B         A, B は整数型の変数。
                   結果の値は真のとき1、偽のとき0