jjs 的 -Scripting 选项

jjs shell 是一个不错的方法来测试一些基本的 JavaScript,或者于不太熟悉的 JavaScript包进行交互(主要是指 javax.script)的方式,然而,在即时预览功能下,它缺乏多行输入和其他先进的功能,通常会在开发中稍微受限。

相反,在非交互的情境下使用 jjs 更加合适,例如运行一个用 JavaScript 写的后台守护进程,就可以这样使用:

$ jjs -scripting my_script.js

这使我们能够利用 jjs 的增强功能,这些包括一些有用的扩展,而其中的一些扩展对熟悉脚本程序员来说更加容易。

脚本注释

在Unix脚本语言中,使用“#”来注释一行的代码,在 Nashorn 里同样适用:

#!/usr/bin/jjs
# A perfectly legal comment in scripting mode
print("After the comment");

执行内置命令

此功能通常被称为“反撇号”由经验丰富的Unix程序员来使用。所以,我们可以利用Unix curl命令用来从谷歌点击下载内容:

echo "Google says: " `curl http://www.google.co.uk

我们也可以在 Nashorn 环境下执行相同功能的 Unix 命令:

print("Google says: "+ `curl http://www.google.co.uk`);

字符串插值

字符串插值是一种特殊的语法,允许程序员直接包含一个变量而不使用字符串连接。在Nashorn中,我们可以使用语法${} 插在字符串变量。例如,上一个下载网页的例子可以用这样的插值来重写:

var url = "www.google.co.uk";
var pageContents = `curl http://${url}`;
print("Google says: ${pageContents}");

特殊变量

Nashorn 也提供了一些特殊的全局变量和函数,特别有助于脚本和正常情况下不可用的JavaScript 中。例如,一个脚本的参数可以通过变量 $ARG 来访问。这个参数用“--”来约定,像这样:

jjs test1.jjs -- aa bbb cccc

然后这些参数可以在下面的例子中访问:

print($ARG);

for(var i=0; i < $ARG.length; i++) {
print("${i}: "+ $ARG[i]);
}

注意:

变量 $ARG 是 JavaScript 数组。对于来自其他语言的程序员(例如 Perl )来说,这个语法可能有点混乱,其中 $ 符号通常表示标量变量。

下一个特殊的全局变量,是 $ENV,提供对当前的环境变量的一个接口。例如,打印当前用户的主目录:

print("HOME = "+ $ENV.HOME); # Prints /home/ben for me

Nashorn 中也提供了一个特殊的全局函数称为 exec()。这就像我们刚才遇到的反撇号的用法,如本例所示:

var execOutput = $EXEC("echo Print this on stdout");
print(execOutput);

你可能已经注意到,当我们使用反撇号或 \(exec() 执行的命令的输出并没有打印出来,而是最终作为函数的返回值。这是为了防止在脚本的输出时打印一些无用的信息。
Nashorn 提供了其他两个特殊的变量供程序员使用,从脚本中执行命令的输出工作:\)OUT 和 $ERR,用于捕获从脚本中执行的命令的输出和任何错误消息。例如:

$EXEC("echo Print this on stdout");
// Code that doesn't change stdout
var saveOut = $OUT;
print("- - - - - - -");
print(saveOut);

内联文档

JavaScript,Java 并不支持字符串在同一个引号内分行书写,但是 Nashorn 在脚本模式下是支持的,在脚本预言中,可以使用这样的语法:<<END_TOKEN,来标识字符串的开始,一直到表示结束的标识符,这个标识符可以是任意的字符串,不过通常来使用END, END_DOC, END_STR, EOF, 和 EOSTR这样意义明显的字符串,在结束标识符结束以后,脚本语言恢复正常,看下面的例子:

var hw = "Hello World!";
var output = <<EOSTR;
This is a multiline string
It can interpolate too - ${hw}
EOSTR
print(output);

Nashorn 的辅助功能

Nashorn 还提供了一些辅助功能,让开发人员可以完成常见的任务,使执行的shell脚本更加容易:

  • print() / echo()

    我们一直在许多实例中使用 print() 方法,这些方法通常用来验证程序的预期行为。它会打印传递给它的字符串,后跟一个换行符。
  • quit() / exit()

    这两个方法完全相等,它们都会导致脚本退出。它们可以使用一个整数参数,该参数将用作脚本进程的返回代码。如果没有提供参数,按照惯例为Unix 惯例,默认使用0。
  • readLine()

    从标准输入读取一行输入(通常是键盘)。默认情况下,它将在标准输出下打印一行,但如果 readline() 返回值赋值给一个变量,输入的数据会被变量里的值替换掉,如下面的例子:
print("Please enter your name: ");
var name = readLine();
print("Please enter your age: ");
var age = readLine();
print(<<EOREC);
Student Record
-+-+-+-+-+-+-+-
Name: ${name}
Age: ${age}
EOREC
  • readFully()

    不是从标准输入读取,readfully() 加载一个文件的所有内容。与 readline() 一样,打印内容到标准输出,或赋给一个变量:
var contents = readFully("input.txt");
  • load()

    此方法用来加载和评估(通过 JavaScript 的eval)脚本。脚本可以由本地路径或URL定位。或者,它可以使用 JavaScript 的脚本对象标识定义为一个字符串。

注意:

当使用 load() 来加载其他脚本,可能会发生意外的错误。JavaScript 支持的形式使用 try-catch 块的异常处理,那么你在加载代码应该使用它。

这里是一个简单的例子,如何从 Nashorn 负载D3可视化图形库:

try {
load("http://d3js.org/d3.v3.min.js");
} catch (e) {
print("Something went wrong, probably that we're not a web browser");
}
  • loadWithNewGlobal()

    当我们使用 load() 方法,它是基于当前 JavaScript 上下文脚本。有时我们想把脚本放到自己的,干净的上下文。在这些情况下,使用loadwithnewglobal() 来开始一个全新和全局的上下文。

表达式语法

这些特性使 jjs 成为一个很好的选择,就像 shell,Perl 或是其它脚本语言一样利于书写。而表达式语法这一终极特性,使得在 Nashorn 下建立书写脚本语言成为可能。

注意:

如果一个可执行的脚本的第一行以#!开头,接下来是路径的可执行文件,则 Unix 操作系统将路径指向一个解释器,能够处理这种类型的脚本。如果脚本被执行,操作系统将执行解释器并将其传递给需要处理的脚本文件。

在这种情况下,为 Nashorn 建立一个软连接会是一个非常不错的实践。我们可以吧 jjs 库的实际位置(通常是 $JAVA_HOME/bin/jjs)软连接到 /usr/bin/jjs (或 /usr/local/bin/jjs),然后脚本语言就可以这样写啦!

#!/usr/bin/jjs
# ... rest of script

对于更高级的使用情况(例如,长时间运行的守护进程),甚至可以兼容 Node.js。这是由 Avatar 项目下的 avatar.js 来实现的。

我们看到,Nashorn 使 JavaScript 代码可以直接运行在命令行工具下,但在许多情况下,我们需要在 Java 代码中执行 JavaScript,这时候我们就需要 javax.script java 这个包下的 API 了。

Java Nashorn--Part 3的更多相关文章

  1. Java 7 可执行的 Nashorn,取代 Rhino

    惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都能够使用.源代码在 https://bitbucket.org/ramonza/nashorn-backport ...

  2. Learning Java 8 Syntax (Java in a Nutshell 6th)

    Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...

  3. Atitit。Js调用后台语言 java c#  php swing android  swt的方法大总结

    Atitit.Js调用后台语言 java c#  php swing android  swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt  BrowserFunction 绑定方法 ...

  4. JS代码检查工具ESLint

    前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. Java 8 的 Nashorn 脚本引擎教程

    本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...

  7. Nashorn 在JDK 8中融合Java与JavaScript之力

    从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...

  8. Nashorn——在JDK 8中融合Java与JavaScript之力

      从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...

  9. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

  10. Java 8 Nashorn JavaScript

    转自:https://www.runoob.com/java/java8-nashorn-javascript.html Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Na ...

随机推荐

  1. angular5 基于ngx-translate实现多语言切换

    angular的坑永远都是那么多,当然了,主要还是我太菜~ 基于ngx-translate实现多语言切换这个功能,我又是折腾了很久,下面是我实现的过程: 1.安装ngx-translate 需要安装@ ...

  2. iOS编程(双语版) - 视图 - 手工代码(不使用向导)创建视图

    如何创建一个空的项目,最早的时候XCode的项目想到中,还有Empty Application template这个选项,后来Apple把它 给去掉了. 我们创建一个单视图项目. 1) 删除main. ...

  3. Python小任务 - 如何编写指定时间执行的Python小程序

    我们在平时的工作中经常会遇到这样的需求,需要再某个时间点执行一段程序逻辑. 那么,在python中我们是怎么做的呢? 下面看代码: waitDesignatedTimeToRun.py import ...

  4. KindEditor-编辑器配置参数属性

    KindEditor-源码分析 通过使用KE.show(config)方法即可将编辑器添加到文档中.下面是一段源码: KE.show = function(args) {     KE.init(ar ...

  5. fdisk -l 参数详解

    [root@node1 ~]# fdisk -l Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors // 扇区个数 Unit ...

  6. TQ2440与西门子S7-200 PLC自由口通信实现过程中问题总结

    1.在win7上安装好PLC编程软件 STEP 7 MicroWIN 之后,无法实现编程软件与PLC的通信连接? 原因:STEP 7 MicroWIN 对win7支持不是很好 解决办法:在win7中安 ...

  7. python知识合集

    python安装包管理  http://www.cnblogs.com/wilber2013/p/4769467.html python pip安装源管理:pypi官网的源不太好,网速慢,容易造成包下 ...

  8. JDBC编程之事务的使用教程

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html  关于事务的理论知识.ACID特性等等,网上太多了,在此不一一重复.本文主要着重  事务 ...

  9. length-of-last-word 最后一个单词的长度

    Given a string s consists of upper/lower-case alphabets and empty space characters' ', return the le ...

  10. CSDN开源夏令营 基于Compiz的switcher插件设计与实现之编译compiz源代码

    在開始介绍之前先吐个嘈:上周我们暑期ACM集训開始了.平均下来基本上是一天一赛.有时还不止.又是多校联赛,又是CodeForces,又是TopCoder.又是BestCoder,又是AcDream.还 ...