bs 命令

用途

编译并解释中小型程序。

语法

bs [ File [ Arguments ]]

描述

bs 命令是用于交互式程序开发和调试的编译器和解释器。 为了简化程序测试,它使形式数据声明和文件操作最小化,允许每次一行的调试,并提供跟踪、转储工具和运行时错误消息。

可选的参数 File 指定所创建的以及编译器从标准输入读取之前读取的程序语句文件。 从标准输入输入的语句通常会立即执行 (请参阅 编译执行 语句语法)。 缺省情况下,编译从 File 读取的语句用于以后的执行。

除非最终运算符是变量的赋值,否则会显示即时表达式语句的结果。

可以使用内置函数 argnarg将其他命令行 Arguments 传递到程序。

程序行必须符合下列其中一种格式:

statement
label statement

仅当解释器正在编译语句时,它会接受带有标签的语句。 标签是后紧跟冒号的名称。 标签和变量可以具有相同的名称。 如果一行的最后一个字符是 \ (反斜杠),那么语句会在余下的物理行上继续。

语句由表达式或跟有零或更多表达式的关键字组成。

注: 要避免在国际环境中使用范围表达式时产生不可预测的结果,请使用字符类表达式而不是标准范围表达式。

语句语法

描述
break 退出最内层 forwhile 循环。
清除 从内存清除符号表并除去已编译的语句。 clear 总是被立即执行。
编译 [表达式] 导致编译后继语句(覆盖立即执行缺省)。 对可选的 Expression 进行求值并将它用作进一步输入的文件名。 后面的情况中,符号表和内存首先被清除。 compile 总是被立即执行。
CONTINUE 将控制传送至当前 forwhile 循环的循环继续测试。
转储 [名称] 显示每个全局变量的名称和当前值或选择显示 Named 变量的名称和当前值。 在错误或中断之后,dump 显示最后语句的编号以及(有可能)用户函数跟踪。
exit [表达式] 返回至系统级别。 Expression 作为进程状态被返回。
执行 更改至立即执行方式(按“INTERRUPT”键有相同功能)。 此语句不会导致执行存储的语句 (请参阅 run)。
for 在指定变量的控制下使用下列其中一种语法重复执行一个语句或一组语句:
for name=Expression Expression statement
next

for name=Expression Expression
statement . . . 
next

for Expression, Expression, Expression statement
next

for Expression, Expression, Expression
statement . . .
next

第一个格式指定单个语句,其中变量呈现为第一个表达式的值,然后每次循环时都加一,直到它超过第二个表达式的值。 可以使用第二个格式做同样的事情,但也可以指定一组语句。

第三个格式要求紧跟有测试表达式(比如 true to continue)和循环继续操作表达式的初始表达式。 可以使用第四个格式做同样的事情,但也可以指定一组语句。 在第三个和第四个格式中,使用逗号来分隔表达式。

好玩 使用以下语法定义用户写函数:
fun f ([a. . . ]) [v. . . ]
statement . . . 
nuf

f 指定函数名称,a 指定任意参数,而 v 为用户写函数标识任意本地变量。 可指定多达 10 个参数和本地变量;然而,它们不能是阵列或不能与 I/O 功能相关联。 不能嵌套函数定义。

freturn 发出“用户写函数失败”信号。 不带有问号,freturn 返回零。 (请参阅一元问询运算符 ( ?)。) 通过问询, freturn 将传输到被问表达式,可能绕过中间函数返回。
转至 名称 将控制传递至具有 Name 的匹配标签的已编译语句。
ibase n 将输入库设置为 n n 唯一受支持的值为 8 10 (缺省值) 和 16 十六进制值 10-15 作为字母字符 a-f 输入 当十六进制数字以字母字符作为开头时,会要求具有前导数字(例如,f0a 必须以 0f0a 的形式输入)。 ibase 总是被立即执行。
IF 使用下列其中一种语法执行语句:
if Expression statement
[else
statement . . . ]
fi

if Expression
statement . . .
 [else
statement . . . ]
fi

第一个格式指定单个语句而第二个格式指定要继续使用的一组语句(如果该表达式的求值相当于非零)。 字符串 0 和“”(空)相当于零。

第二个格式中,在未执行第一组语句的情况下,可选的 else 允许执行另一组语句。 只有 if 语句可以在 else 的同一行上。 fis 只能放在与另一个 fi 相同的行上。 可将 elseif 结合为 elif。 您可以关闭 if ..。 elif ... [else .. ] 具有单个 fi的序列。

include 表达式 Expression 相当于包含程序语句的文件名。 这样的语句成为正在编译的程序一部分。 include 总是被立即执行。 不要嵌套 include 语句。
obase n 将输出基数设置为 n n 唯一受支持的值为 8 , 10 (缺省值) 和 16 十六进制值 10 到 15 作为 a-f 字母字符输入 当十六进制数字以字母字符作为开头时,会要求具有前导数字(即,f0a 必须以 0f0a 的形式输入)。 与 ibase 一样,obase 总是被立即执行。
onintr 使用下列其中一种语法提供中断的程序控制:
onintr Label

onintr

第一个格式中,控制传递至给出的 Label,就好像执行 onintr 时,已经执行了 goto。 每次中断后,onintr 语句的作用被清除。 第二个格式中,按“INTERRUPT”结束 bs 程序。

return [表达式] Expression 进行求值并将结果作为函数调用的值传递回来。 如果不提供表达式,函数返回的是零。
运行 将控制传递给编译的第一个语句。 复位随机号码生成器。 如果文件包含 run 语句,它应该是最后的语句;run 总是被立即执行。
STOP 停止已编译语句的执行并返回至立即方式。
trace [表达式] 控制函数跟踪。 如果不提供 Expression 或者如果它求值为零,会关闭跟踪。 否则,会写下用户函数调用/返回记录。 每次返回都逐一递减 trace 表达式的值。
while 在指定变量的控制下使用下列其中一种语法重复执行一个语句或一组语句:
while Expression statement
next

while Expression
statement . . . 
next

while 语句同 for 语句很相似,除了前者仅给出循环继续的条件表达式。

!命令 运行命令然后将控制返回至 bs 程序。
# 注释 插入一个注释行。

表达式语法

描述
名称 指定变量或者标签(当紧跟有冒号时)。 名称由可选择地紧跟有字母和数字的字母(大小写均可)组成。 只有名字的前六个字符是有意义的。 除了 fun 语句中本地声明的名称,所有名称都是全局的。 名称可以采用数字 (双浮点) 值或字符串值,也可以与输入/输出相关联 (请参阅内置函数 open)。
名称([Expression[, Expression] .. ]) 调用函数 Name,并将括号中的参数传递给它。 除非内置函数,Name 必须在 fun 语句中被定义。 函数参数由值来传递。
名称[Expression[, Expression]... ] 引用数组或表 (请参阅内置函数 table)。 对于数组,将每个表达式截断为整数并用作名称的说明符。 最终的数组引用在语法上同名称相同;[1,2] 与 [1] [2] 的意义是相同的。 被截断的表达式必须是 0 和 32,767 之间的值。
编号 代表常量数字值。 该数字可以表达为整数、十进制或科学符号(可以包含数字、可选的十进制点和跟有可能的带符号指数的可选的 e)。
String 代表由 ""(双引号)定界的字符串。 在字符串中,可以把 \ (反斜杠) 用作转义字符,它允许双引号 ( \")、换行符 ( \n)、回车 ( \r)、退格 ( \b) 和跳格 ( \t) 字符出现在一个字符串中。 如果不是紧跟有这些特殊字符, \ 只表示自己。
(表达式) 改变求值的正常顺序。
(Expression Expression[, Expression] .. ) [表达式] 指定把在圆括号外加方括号的表达式用作圆括号内表达式列表的下标。 列表元素从左开始编号,以零为开始。 如果比较为真,那么以下表达式的值也为真(True):
(False, True) [a == b]
表达式 运算符 表达式 在应用运算符之前,将操作数转换成数字形式,除非运算符是个赋值、级连或关系运算符。

一元运算符

描述
? 表达式 测试 Expression 是否成功,而非它的值。 此询问运算符有助于测试:
  • 文件末尾
  • eval 内置函数的结果
  • 从用户编写的函数返回 (请参阅 freturn)

询问陷阱(例如,文件末尾)会引起至最近询问的立即转换(可能跳过赋值语句或插入函数级别)。

- 表达式 Expression 求反。
+ + 名称 使变量(或数组引用)的值逐一递增。
- 名称 使变量的值逐一递减。
! 表达式 指定 Expression 的逻辑非。

注: 一元运算符将空字符串视为零。

二目运算符(在增加的优先顺序中)

描述
= 指定赋值运算符。 左边的操作数必须是名称或数组元素。 它会获取右边操作数的值。 赋值从右绑定至左;所有其他运算符从左绑定至右。
_ 指定级连运算符。 (它是加下划线的字符。)
& | 指定逻辑与、逻辑或。

仅当

Expression & 表达式

的两个参数都是非零 (true) 时,它的结果是 1 (true);如果其中一个或两个参数都是 0 (false),它的结果是 0 (false)。

仅当

表达式 | 表达式

的一个或两个表达式都为非零 (true),那么它的结果是 1 (true);仅当它的两个表达式都是 0 (false) 时,它的结果是 0 (false)。 两个运算符都将空字符串作为零。

< <= > >= == != 指定关系运算符:
  • < 表示小于
  • <= 表示小于或等于
  • > 表示大于
  • > = 大于或等于
  • == 表示等于
  • != 表示不等于

如果指定的关系为 true,关系运算符返回 1;否则,它们返回 0(false)。 同一级别的关系运算符如下扩展: a> b> ca>b& b>c相同。 如果两个操作数都是字符串,会进行字符串比较。 该比较是基于在环境变量 LC_COLLATE 中指定的整理顺序。

+ - 指定加和减。
* / % 指定乘、除和余数。
^ 指定乘幂。

注: 二进制运算符将空字符串视为零。

处理参数的函数

描述
arg(i) 返回处在当前函数调用级别的第 i- 个实际自变量的值。 在零级别,arg 返回第 i- 个命令行自变量。 例如,arg(0) 返回 bs
narg() 返回已通过的自变量数。 在零级别,它返回命令行自变量计数。

数学函数

描述
abs(x) 返回 x 的绝对值。
atan(x) 返回 x 的反正切。
ceil(x) 返回不小于 x 的最小整数。
cos(x) 返回 x 余弦。
exp(x) 返回升至 x 的乘幂的 e。
楼层(x) 返回不大于 x 的最大整数。
log(x) 返回 x 的自然对数。
rand() 返回 0 和 1 之间整齐分布的随机数字。
sin(x) 返回 x 的正弦。
sqrt(x) 返回 x 平方根。

字符串函数

描述
大小(s) 返回 s 的大小(以字符为长度)。
bsize(s) 返回 s 的大小(以字节为长度)。
format(f a) 返回 a 的已被格式化的值, f,该值是 printf 子例程样式中的格式规范字符串。 仅使用 %...f %...e%...s 格式。
index(x y) 返回包含与 y 中的任何字符相匹配的字符在 x 中的第一个位置的数字。 如果没有找到匹配,那么返回 0。 对于 2 字节扩展字符,那么返回第一个字节的位置。
trans(s f t) 将与 f 中的字符匹配的源字符串 s 中的字符转换为在 t中具有相同位置的字符。 不会出现在 f 中的源字符将按原样复制到转换后的字符串中。 如果字符串 f t 长,那么与 f 的超出部分中所找到的字符相匹配的源字符不会出现在已转换的字符串中。
substr(s Start Length) 返回由字符中的 Start 位置和 Length 定义的 s 的子串。
match(String Pattern) mstring(n) 返回 string 中与 pattern 相匹配的字符数。 字符 ., *, $, [, ], ^ (当处于方括号内时), \ (和 \) 具有以下特殊含义:

注:有关此特殊符号的更详细的说明,请参阅 ed

.
匹配除了换行符的任何字符。
*
匹配零或在它之前的模式元素的更多具体值。 例如, .* 与除换行符以外的任何字符的零个或零个以上匹配。
$
指定行的末尾。
[.-.]
匹配所指定范围 ([.-.]) 中的任一字符或者列示 ([ . . . ]),包括第一个字符和最后一个字符。
[^ .-.]
[^ . . . ]
与除了换行符以外的任何字符和一个范围或列表内的任何剩余字符相匹配。 音调符号 (^) 仅在其紧跟左方括号时才具有特殊含义。
[].-.]
[] . . . ]
匹配 ] 或列表中的任何字符。 如果右方括号是某一列表中的第一个字符(如果有,跟在最初的 ^ 之后),它不会终止这样的列表。
\( . . . \)
标记子串并与之严格匹配。它的模式必须从字符串的开头起相匹配,且是最长的可能字符串。 考虑,例如:
match ('a123ab123',".*\([a-z]\)") = 6

在此实例中, .* 匹配 a 123a(在 a-z 范围内的字符之前的最长字符串);\ ([a-z]\)匹配b,给出字符串中匹配的共有 6 个字符。 在表达式中,例如[a-z] 根据当前整理顺序,减号表示 "through"。

整理顺序可以定义等价的类以供在字符范围中使用。 有关整理顺序和等价类的更多信息,请参阅“International Character Support Overview”。

mstring 函数在最后调用中将第 n 个子串返回给 match n 只能处于 1 和 10(包括 1 和 10)之间)。

处理文件的函数

open(名称,文件,方式)

描述
close(名称) 指定名称、文件类型和文件方式。 Name 必须是合法的变量名(作为字符串通过)。 在 close 之后,此名称变成一般变量。 对于 open,File 可以是下列其中一项:
  • 标准输入:0
  • 标准输出:1
  • 错误输出:2
  • 代表文件名称的字符串
  • 以! 开头的字符串, 表示要运行的命令(使用 "sh-c")

必须用 r(代表读取)、w(代表写入)、W(代表不带换行符写入)或 a(代表添加)来指定 Mode。 初始关联是:

  • open ("get", 0, "r")
  • open ("put", 1, "w")
  • open ("puterr", 2, "w")
access(p , m) 执行访问子例程。 参数 p 是文件的路径名;m 是表示请求的访问方式的位模式。 如果系统请求被许可,此函数返回 0,反之则是 1。
ftype () 返回表示文件类型的单个字符:f 代表常规文件,p 代表 FIFO(命名管道),d 代表目录,b 代表特殊块而 c 代表特殊字符。

表函数

描述
table(名称和大小) 指定可被关联访问的一维的数组。 “下标”(称作键)是字符串(被转换的数字)。 Name 必须是 bs 变量名(作为字符串通过)。 Size 设置要分配的元素的最小数量。 表一旦溢出,bs 就会写错误消息。
item(名称, i)  
key () 相继的而非键值的行进顺序访问表元素。 项函数在哪里访问值,键函数访问前一个项调入的“下标”。 不要引用 Name

由于还未定义实际表的大小,询问运算符应该被用于检测表尾;例如:

table("t",100)

               
.
.
.
#If word contains "parity", the following expression
#adds one to the count of that word:
++t[word]
.
.
.
#To display the key/value pairs:
for i = 0, ? (s = item (t, i)), ++i if key( ) put = key
( )_":"_s
iskey(名称和 Word) 测试键字是否在表名称中存在并且返回 1(true),反之则返回 0(false)。

其他功能

描述
eval(字符串) 指定将字符串参数作为表达式求值。 该函数用于将数字字符串转换为数字。 eval 也可以用作粗略的 indirection 形式,例如:
name = "x,y,z"
eval("++"_name)

这将使变量递增"x,y,z". 此外,当 eval 前面有? (询问运算符)时,可以控制 bs 错误条件。 例如:

?eval ("open(\"X\",\"XXX\", \"r\")")

如果没有指定的文件,那么返回值 0"XXX"(而不是停止程序)。 以下内容将 goto 执行到标签“L:”(如果它存在):

label = "L:"
if! (?eval ("goto"_label))puterr="no label"
散点图(请求,参数) 产生有关被 tplot 命令识别的设备的输出。 一些请求不能被应用于所有绘图仪。 除了 0 和 12,所有请求都可通过将字符经由管道传递至 tplot 来实现。

调用请求如下:

图 (0)
使进一步的散点图输出以 -T术语。 标志输送到
图 (1)
擦除绘图仪。
图 (2string)
string 为当前点进行标号
图 (3x1, y1, x2, y2)
(x1, y1) 和 ( x2, y2) 之间画线。
图 (4x , y , r)
以圆心(x, y)和半径 r 画圆。
图 (5 , x1 , y1, x2, y2, x3, y3)
以圆心 (x1, y1) 及终止点 (x2, y2) (x3, y3) 画弧形(逆时针方向)。
图 (6)
不实现。
图 (7x , y)
(x, y) 标记当前点。
图 (8x, y)
从当前点画线至 (x ,y)
图 (9 , x , y)
(x, y) 处画点。
图 (10 , 字符串)
将线方式设置为字符串
图 (11 x1, y1, x2, y2)
(x1, y1) 作为绘图区域的左下角而 (x2, y2) 作为绘图区域的右上角。
图 (12 x1, y1, x2, y2)
使后续的 x(y) 坐标在进行绘画之前与 x1 (y1) 相乘,然后被添加至 x2 (y2)。 初始缩放法为 plot(12, 1.0, 1.0, 0.0, 0.0)。
last () 以立即方式返回最近计算的值。

示例

要执行 bs 命令并将结果导向称为输出的文件,请输入:

bs < input.n > output

bs input.n > output