3

我真的对 OpenVMS 的 DCL 中的一些语法感到困惑。例如,这些是让我感到困惑的一些行:

$    wo = "write sys$output"

wo它是否为写入 sys$output创建了一个符号?

$ billing_run_number   == p1

执行时是否p1将参数传递给 .com 文件?它可以提供多少个参数?

$ wo "BILLING_RUN_NUMBER   = ''billing_run_number'"

''abc' 是否被符号 abc 的内容所取代?为什么是“abc”而不是“abc”?我们可以使用“”吗?

$ if ((status .nes. "P") .and. (status .nes. "M")) .or. (ftp_status .nes. "Y")

是什么.nes.意思?平等的?我也看过.ne。, .eqs。也。他们有什么不同?

为什么“and”和“or”被两个点包围?DCL 特定的语法?

如果有任何易于理解的免费在线教程会很好。谢谢你们!

4

4 回答 4

5

您可以在http://hp.com/go/vms在线找到 VMS 文档

您要阅读的手册是位于http://h71000.www7.hp.com/doc/731final/documentation/pdf/ovms_731_users.pdf的 OpenVMS 用户手册(特别是第 2 章)。

于 2011-07-05T13:48:09.440 回答
4

从内存:$ wo = "write sys$output"正如你所说,将 wo 指定为“write sys$output”的别名,VMS 相当于 Unix 标准输出。

.nes.是“不等于字符串”,与之相比.ne.是数字“不等于”。

p1 是您猜到的(第一个)参数。我不记得它是从 p1 到 p9 还是更多,或者是否没有任意限制。p0 可能是程序名称,如 Python 的 sys.argv[0]。

一个命令过程最多接受 8 个参数,称为 P1 .. P8。

单引号 (') 会插入以下变量名,因此wo "BILLING_RUN_NUMBER = ''billing_run_number'"会输出,例如,BILLING_RUN_NUMBER = '42'假设 p1 等于 42。我不记得 DCL 是如何知道在连续看到两个单引号时该怎么做的...

官方的咒语是 ''symbol' 将实际的 DCL 文本替换为 symbol 的值

这至少能让你开始……大多数使用 VMS 的商店在 3 环活页夹中都有几百磅的文档。问问周围。

于 2011-07-04T07:57:00.587 回答
2

p1 是执行时传递给 .com 文件的参数吗?它可以提供多少个参数?

您最多可以传递 8 个参数。每一个都定义为 P1, P2... P8

如果你需要超过 8 个参数,你可以使用类似的技巧

@my_dcl “my_p1” “my_p2” “my_p3” “my_p4” “my_p5” “my_p6” “my_p7” “my_p8 my_p9 my_p10”

my_dcl中,P8将在一个字符串中包含“my_p8 my_p9 my_p10”的值。

$ wo "BILLING_RUN_NUMBER = ''billing_run_number'"

''abc' 是否被符号 abc 的内容所取代?为什么是“abc”而不是“abc”?我们可以使用“”吗?

$ if ((status .nes. "P") .and. (status .nes. "M")) .or. (ftp_status .nes。“Y”)

单引号表示翻译字符串的内容。

所以,如果你定义wo = "write sys$output"

您可以使用

wo "Hello World!"

或者

'wo "Hello World!"

但是如果你想展示write sys$output Hello World

如果你试试,

wo "'wo Hello World!"

你会得到 wo'wo Hello World!

所以,你必须用单引号括起来。

前两个是转义的单引号,最后一个表示停止翻译。

wo "''wo' 你好,世界!"


像其他脚本语言一样,您可以拥有可变变量...

var_hidden = "Hello world!"
my_var = "var_hidden"
wo 'my_var'

将打印 Hello world!

于 2011-07-05T13:19:32.163 回答
2

除了上面引用的文档之外,还有通过 HELP HINTS、HELP :=、HELP = 和 HELP @ 命令提供的大量信息。我相信 P9-P16 随 OpenVMS V8.4 一起提供。

此外,请注意全局符号(使用双等号 {== 或 :==} 定义)和局部符号(使用单个等号 {= 或 :=} 定义)之间的区别。就像在区分大小写的语言中一样,定义 A = 1 的符号与定义的 A == 1 是不同的符号,并且本地符号可以屏蔽对全局符号的引用 - 像 READ 和 INQUIRE 这样的一些命令也可以创建符号,但我认为它们始终是本地符号 - 验证这一点,因为我是在记忆中工作。\

命令 SET SYMBOL /SCOPE[={LOCAL|NOLOCAL},{GLOBAL|NOGLOBAL}) 也会影响您是否可以看到某些类型的符号。

一般而言,尽可能使用局部符号 - 如果更高级别(调用)命令过程需要访问,或者如果您需要返回交互式 DCL 时仍定义的符号,则通常只需要全局符号 - 任何程序除外你运行它专门读取或写入或创建一个全局符号 - 很少见,但我遇到了一些。

于 2011-09-12T18:55:48.067 回答