[an error occurred while processing this directive]

HP OpenVMS Systems Documentation

Content starts here

OpenVMS 用户手册


前页 目录 索引


第 12 章
定义符号、命令和表达式

符号是表示数字、字符或逻辑值 (例如真或假) 的名称。在 DCL 命令行中使用一个符号时,DCL 在执行这个命令之前用它的值替换符号。

输入包括参数、多个限定词和值的 DCL 命令行可能需要很多键入并且可能耗费很多时间。要简化与 DCL 的交互并节省时间,可以建立符号来代替频繁地键入命令。

您也可以在命令过程中使用符号来收集、存储和处理某些类型的数据。有关命令过程的详情,请参阅第 13 章第 14 章

本章描述:

  • 使用符号
  • 显示符号
  • 与其他符号一起使用符号
  • 使用符号存储和处理数据
  • 字符串
  • 使用数值和表达式
  • 使用逻辑值和表达式
  • 在表达式中转换值的类型
  • 理解符号表
  • 屏蔽符号值
  • 理解符号替换
  • 命令处理程序的三个阶段
  • 使用符号的备用方法: 自动外部命令

有关详情,请参阅以下:

  • OpenVMS DCL Dictionary,有关符号和使用的详情
  • OpenVMS Command Definition, Librarian, and Message Utilities Manual,有关定义新命令的详情

12.1 关于符号

您可以用以下方法使用符号:

  • 作为命令、参数或命令行的同义词。代替键入长命令行,您可以建立代替使用的符号。
  • 定义一个外部命令,允许您只输入符号名就可执行一个映象。该命令是 "外部的",因为对于 DCL 来说,它是未知的。
  • 在命令过程文件中,执行编程任务,如条件执行和变量替换。
    可以使用符号作为表达式中的变量,或者传送参数给命令过程和从命令过程传回。另外,DCL 命令 (如 READ、WRITE 和 INQUIRE) 可使用符号引用数据记录。

在以下例子中,建立一个符号,并把它设置为经常存取的默认目录。这些命令展示如何定义和使用符号 WORK 把默认目录设置为 WORK1:[JONES.WORK] 目录:


$  WORK :== SET DEFAULT DISK1:[JONES.WORK]
$  WORK
$  SHOW DEFAULT
   DISK1:[JONES.WORK]

12.1.1 比较逻辑名和符号

虽然逻辑名和符号类似,但它们的使用不同。以下表格比较逻辑名和符号的功能、使用和其他特征:

特征 逻辑名 符号
功能 表示设备、目录、文件、队列和其他系统对象说明。 表示命令或部分命令串。
使用 用于代替任何完整的设备、目录、文件、队列或其他系统对象说明。逻辑名必须用作命令串参数的一部分,以便传送给文件系统翻译。 用于代替任何命令串。符号必须用作命令字符串中的第一个字,以便命令语言解释程序翻译。
存储 存储在进程、作业、组或系统逻辑名表内。请参阅 11.10 节 存储在全局或局部符号表。请参阅 12.10 节
建立 使用 ASSIGN 或 DEFINE 命令建立逻辑名。请参阅 11.3 节 使用赋值语句 (= 或 ==) 建立符号。请参阅 12.2 节
显示 使用 SHOW LOGICAL 或 SHOW TRANSLATION 命令显示逻辑名。请参阅 11.6 节 使用 SHOW SYMBOL 命令显示符号。请参阅 12.3 节
删除 使用 DEASSIGN 命令删除逻辑名。请参阅 11.4 节 使用 DELETE/SYMBOL 命令删除符号。请参阅 12.2.5 节

12.2 使用符号

您可以建立两类符号,局部和全局。局部符号可从当前命令级和当前命令级执行的命令过程中存取。全局符号则可从所有命令级存取。

您可以用一个字符串、数、词法函数、逻辑值或另一个符号定义一个符号。符号名可以是 1 至 255 个字符长,并且必须开始是一个字母、下划线 (_) 或美元符 ($)。在符号名中,小写和大写字母都被处理为大写字母。

要建立一个符号,使用赋值语句 (= 或 ==) 或字符串赋值 (:= 或 ::=、=)。当使用字符串赋值时,所有字母字符被转换为大写字母,而多个空格和制表符被压缩为单个空格。可以使用字符串赋值来建立一个表示 DCL 命令或定义外部命令的符号 (注意,在任何一种情况下,都有 255 个字符长的限制)。要在一个字符串赋值中使字符串跨行,使用一个连字号。

您也可以使用 READ 和 INQUIRE 命令建立符号 (请参阅第 13 章第 14 章)。

建立局部符号

在以下例子中,局部符号 SS 被赋值为 DCL 命令 SHOW SYMBOL:


$ SS = "SHOW SYMBOL"

在以下例子中,局部符号 DB 赋值为 DCL 命令 DIRECTORY ACCOUNTS:[BOLIVAR]:


$ DB := DIRECTORY ACCOUNTS:[BOLIVAR]

建立全局符号

在以下例子中,全局符号 DC 用来表示一个 DCL 命令行。当输入这个符号名时,DCL 命令 DIRECTORY 带指定限定词执行:


$ DC == "DIRECTORY/SIZE=ALL DISK1:[JONES.TAX]MONEY.LIS"

在以下例子中,全局符号 READY 用来表示一个 DCL 命令行。当输入这个符号名时,DCL 命令 PRINT 带指定限定词执行:


$ READY :== PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART
$ READY FILE.DAT

12.2.1 使用符号表示 DCL 命令

您可以在注册命令文件 (LOGIN.COM) 或在 DCL 级交互地定义一个表示 DCL 命令的符号。在注册命令文件中定义符号时,就可以每次注册时使用这个符号;当您交互地定义符号时,只可以在当前进程期间使用这个符号。

如果定义的符号与 DCL 命令同名,您的定义将取代这个 DCL 命令名。例如,如果把符号 HELP 定义为命令 TYPE HELP.LST,那么键入 HELP 时就可以不再调用系统的 Help 公用程序。

12.2.2 符号缩写

使用星号 (*) 建立一个可以缩写的符号。一般而言,可以在允许使用符号的任何情形下使用缩写符号定义。包括子串替换的符号是一个例外。有关详情,请参阅 12.6.5 节

注意,现有的符号也许被取代。如果一个现有符号正确匹配带星号的新符号,那么新符号将替换现有的符号。另外,不能定义另一个其名称部分匹配于带星号的现有符号的符号。

以下例子建立局部符号 PRINT,它可以缩写为 PR、PRI 或 PRIN:


$ PR*INT = "PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART"

要带指定限定词执行这个 DCL 命令 PRINT,可以输入这个符号或它的任何缩写。

12.2.3 定义外部命令

如果把一个非 DCL 映象的文件说明等同于一个符号,键入这个符号名就可以运行这个映象。一个运行映象的符号被称为一个外部命令。外部命令是一个映象,它不被命令解释程序识别为 DCL 命令。(注意,象 DCL 命令一样,外部命令也有 255 个字符长的限制。)

把符号定义为外部命令的格式如下所示:

symbol-name :=[=] $image-file-spec
symbol-name =[=] "$image-file-spec"

注意,在符号定义的开始,美元符 ($) 在文件说明之前并且在美元符和文件说明之间不带任何空格时,意味着请求运行这个映象。

对于映象文件说明,默认设备和目录名是 SYS$SYSTEM,默认文件类型是 .EXE,而默认文件版本号是最高版本。

使用外部命令的另一个方法是使用 Command Definition 公用程序定义新命令。有关详情,请参阅 OpenVMS Command Definition, Librarian, and Message Utilities Manual

也有自动执行外部命令的一种方法,不必指定符号。有关详情,请参阅 12.14 节

在以下例子中,定义全局符号 PRINTALL 执行映象 DISK1:[ACCOUNTS]PRINTALL.EXE:


$ PRINTALL :==   $[ACCOUNTS]PRINTALL

在命令行中,PRINTALL 后面可以跟随一个参数。

在以下例子中,文件说明 RAT.DAT 是一个传送给 PRINTALL 定义的映象的参数:


$ PRINTALL RAT.DAT

12.2.4 符号替换

命令解释程序寻找括入省略号 (') 内的符号,并翻译它们。因而,如果使用前面加上省略号指定参数的符号或词法函数,就发生符号替换 (请参阅 12.12 节)。否则,命令解释程序不分析这一行。映象必须获得参数,并且执行命令行的任何分析或求值。

12.2.5 删除符号

DELETE/SYMBOL 命令删除符号。要删除全局符号,可包括 /GLOBAL 限定词。例如,要删除全局符号 TEMP,输入以下命令:


$ DELETE/SYMBOL/GLOBAL TEMP

12.3 显示符号

SHOW SYMBOL 命令显示符号的值。要显示特定符号的值,输入 SHOW SYMBOL 命令,并且后面跟随这个符号的名称。要显示特定全局符号的值,要包括 /GLOBAL 限定词。SHOW SYMBOL/ALL 命令显示所有局部符号。命令 SHOW SYMBOL/ALL/GLOBAL 显示所有全局符号。

注意,当符号有整数值时,SHOW SYMBOL 命令以十进制、十六进制和八进制符号显示这个值。

在以下例子中,显示符号 PR:


$  SHOW SYMBOL PR
PR*INT = "PRINT/CONFIRM/COPIES=2/QUEUE=DOC$LN03/NOTIFY/RESTART"

在以下例子中,显示符号 TOTAL 的整数值:


$ SHOW SYMBOL TOTAL
  TOTAL = 4   Hex = 00000004  Octal = 00000000004

12.4 与其他符号一起使用符号

在定义了一个符号后,可以使用它作为另一个符号定义的一部分。DCL 把符号解释为一个字符串或一个数字,视使用符号的环境而定。

在以下例子中,整数值 3 赋值给符号 COUNT:


$ COUNT = 3

然后,COUNT 的值可以使用在其他赋值语句中。例如,这里把 COUNT 的值加 1:


$ TOTAL = COUNT + 1

结果 (4) 是等于符号 TOTAL。

12.4.1 符号串联

使用加号 (+),可以把几个符号连接起来建立一个长字符串。使用省略号 (') 括住每个符号名,也可以连接两个或更多的符号。

有关请求符号替换的详情,请参阅 12.12.2 节

在以下例子中,使用符号 "Saturday" 和 "Sunday" 建立符号 "WEEKEND":


$ DAY1 = "Saturday, "
$ DAY2 = "Sunday"
$ WEEKEND = DAY1 + DAY2
$ SHOW SYMBOL WEEKEND
   WEEKEND = "Saturday, Sunday"

在以下例子中,省略号用来连接符号 NAME 和 TYPE:


$ NAME = "MYFILE"
$ TYPE = ".DAT"
$ PRINT 'NAME''TYPE'

PRINT 命令打印 MYFILE.DAT 的一个副本。

12.4.2 在字符串赋值中包括符号

要在字符串赋值中包括局部符号,使用一个冒号和一个等号 (:=)。要在字符串赋值中包括全局符号,使用一个冒号和两个等号 (:==)。对于任意一类符号 (局部或全局),把符号括入省略号 (' ') 内。否则,DCL 将不把它识别为符号。

如果为一个符号定义一个空字符串,那么这个符号的值是 0。

在以下例子中,符号 COUNT 包括在一个字符串赋值语句中:


$ BARK := P'COUNT'

在上一个例子中,COUNT 被赋值为整数值 3。在这个例子中,COUNT 被转换为一个字符串值,并且附加在字符 P 之后。局部符号 BARK 现在的值是 P3。

在以下例子中,符号 A 为空:


$ A = ""
$ B = 2
$ C = A + B
$ SHOW SYMBOL C
   C = 2  Hex = 00000002  Octal = 00000000002

12.5 使用符号存储和处理数据

在命令过程中,可以把符号用作变量。变量拥有您计算或分配不同于文字值的值。例如,可以把词法函数的值分配给变量,或者把文件记录的值读入变量。

表达式是值的混合。在命令过程中,表达式用于符号赋值语句 (在等号的右边)、IF 语句、WRITE 命令和词法函数的变元。

定义一个符号时,赋值语句的左边定义符号名;赋值语句的右边包含表达式。表达式中的每个值 (也称为操作数) 可以通过运算符连接到另一个值。DCL 求表达式的值,并把结果分配给符号。如果表达式求值为字符串,那么符号有字符串值。

在以下例子中,局部符号 BARK 等于一个加三个数的表达式:


$ BARK = 1 + 2 + 3

操作数是 1、2 和 3。运算符是加号 (+)。求值的表达式是整数,因而符号有一个整数值。

12.6 字符串

字符串可以包含任何可以打印的字符。附录 A 包括 ASCII 字符集和 DEC 多国字符集的表。这些表列出可以在字符串中包括的字符。

字符主要分为三类:

  • 字母数字字符
    大写字母 A 至 Z、小写字母 a 至 z、数字 1 至 9、美元符 ($)、下划线 (_) 和连字号 (-)。
  • 特殊字符
    所有可以显示或打印的其他字符: 感叹号 (!)、引号 (")、数字符号 (#),等等。
  • 不可打印的字符
    所有不能打印或显示的字符。一般而言,显示和打印时,忽略不可打印的字符。然而,有几个不可打印的字符具有控制功能,如下所示:
    字符 功能
    HT 在下一个水平制表符开始打印或键入 
    LF 在下一行开始打印或键入
    FF 在下一页顶部开始打印或键入
    CR 在同一行第一个空格处开始打印或键入
    ESC 引入终端换码符
    SP 插入一个空格

12.6.1 定义字符串

把一个字符串括入引号 (" ") 内可以定义它。按这种方法进行符号赋值时,保持字母大小写和空格。注意以下几点:

  • 要在字符串内包括引号 ("),键入两个连续引号。
  • 要使字符串跨行,使用一个加号 (用于字符串串联) 和一个连字号 (用于续行)。
    在引用的字符串内,不能使用连字号续行字符。

在以下例子中,字符串 "YES" 被引用,因而它必须在引号内定义:


$ PROMPT = "Type ""YES"" or ""NO"""
$ SHOW SYMBOL PROMPT
  PROMPT = "Type "YES" or "NO""

在以下例子中,字符串跨行:


$ HEAD = "MONTHLY REPORT FOR" + -
_$ " DECEMBER 1999"
$ SHOW SYMBOL HEAD
  HEAD = "MONTHLY REPORT FOR DECEMBER 1999"

12.6.2 字符串表达式

字符串表达式可以包含字符串、求值为字符串的词法函数或有字符串值的符号。在表达式中使用字符串时,必须把它括入引号 (" ") 内。如果不使用引号,DCL 把字符串处理为符号。

字符串表达式结合以下值 (称为字符串操作数):

  • 必须出现在引号内的字符串
  • 表示字符串的符号
  • 求值为字符串的词法函数

如果在一个字符串和一个数之间执行一个操作或比较,那么 DCL 将把字符串转换为一个数。

字符串操作数可以添加 (字符串串联)、减去 (字符串缩减)、比较或用其他字符串替换,如以下小节所述。

在以下例子中,字符串 "CAT" 必须出现在引号内:


$  TEMP = "CAT"

在以下例子中,符号 TEMP 表示字符串 "CAT"。符号 TOPIC 是字符串 "THE" 和符号 TEMP 表示的字符串 ("CAT") 的串联。其结果是 "THE CAT"。


$  TOPIC = "THE" + TEMP

在以下例子中,符号 COUNT 表示词法函数 F$STRING(65):


$  COUNT = F$STRING(65)

12.6.3 字符串操作

可以指定以下字符串操作:

  • 串联 --- 加号连接两个字符串。
  • 缩减 --- 减号从第一个字符串除去第二个字符串。
    如果第二个字符串在第一个字符串中出现一次以上,那么只除去这个字符串的第一次出现。

在以下例子中,加号 (+) 用来连接两个字符串:


$ COLOR = "light brown"
$ WEIGHT = "30 lbs."
$ DOG2 = "No tag, " + COLOR + ", " + WEIGHT
$ SHOW SYMBOL DOG2
  DOG2 = "No tag, light brown, 30 lbs."

在以下例子中,减号 (-) 用来除去一个字符串:


$ SHOW SYMBOL DOG2
  DOG2 = "No tag, light brown, 30 lbs."
$ DOG2 = DOG2 - ", 30 lbs."
$ SHOW SYMBOL DOG2
  DOG2 = "No tag, light brown"


前页 后页 目录 索引