Nashorn(Java8のJavaScriptエンジン)でシェルスクリプト

Java SE 8 からバンドルされる JavaScript エンジンRhino から Nashorn に変わります。
そこで シェルスクリプトから Nashorn を試してみました。

準備

以下のように jdk に含まれる jjs のシンボリックリンクを作成しておきます。

ln -si /usr/local/java/jdk/bin/jjs /usr/bin/jjs

スクリプト引数

args.js

#!/usr/bin/jjs

print(arguments);
print(arguments[0]);
print(arguments[1]);
print(arguments[2]);

print($ARG);
print($ARG[0]);
print($ARG[1]);
print($ARG[2]);

arguments か $ARG で引数が参照できます。

実行結果

# ./args.js -- arg1 arg2 arg3
arg1,arg2,arg3
arg1
arg2
arg3
arg1,arg2,arg3
arg1
arg2
arg3

変数埋め込み文字列

string.js

#!/usr/bin/jjs

var date = Date();
print("Date and time: ${date}");
print('Date and time: ${date}');

ダブルクォートで括った文字列は、変数が展開され、シングルクォートで括られた文字列は変数が展開されません。

実行結果

# ./string.js
Date and time: Mon Mar 10 2014 04:58:12 GMT+0900 (JST)
Date and time: ${date}

ヒアドキュメント

heredoc.js

#!/usr/bin/jjs

var sql = <<EOD
  select
    id
    name
  from employee
  where department_id=1
EOD

print(sql);

実行結果

# ./heredoc.js
  select
    id
    name
  from employee
  where department_id=1

ヒアドキュメントが使えるのは、嬉しい!

外部コマンドの実行

exec.js

#!/usr/bin/jjs

$EXEC("ls -l");
print($OUT);

`ls -l`;
print($OUT);


$EXEC または、バッククォートで括ると外部コマンドが実行できます。実行結果の標準出力は、$OUT に格納されます。

実行結果

# ./exec.js
total 32
-rwxr-xr-x. 1 root root 190 Mar 10 05:09 args.js
-rwxr-xr-x. 1 root root  36 Mar 10 05:09 env.js
-rwxr-xr-x. 1 root root  70 Mar 10 05:09 exec.js
-rwxr-xr-x. 1 root root 115 Mar 10 05:09 heredoc.js
-rwxr-xr-x. 1 root root  65 Mar 10 05:09 readfully.js
-rwxr-xr-x. 1 root root  88 Mar 10 05:09 readline.js
-rwxr-xr-x. 1 root root 103 Mar 10 05:09 string.js
-rw-r--r--. 1 root root  84 Mar 10 05:09 text.txt

total 32
-rwxr-xr-x. 1 root root 190 Mar 10 05:09 args.js
-rwxr-xr-x. 1 root root  36 Mar 10 05:09 env.js
-rwxr-xr-x. 1 root root  70 Mar 10 05:09 exec.js
-rwxr-xr-x. 1 root root 115 Mar 10 05:09 heredoc.js
-rwxr-xr-x. 1 root root  65 Mar 10 05:09 readfully.js
-rwxr-xr-x. 1 root root  88 Mar 10 05:09 readline.js
-rwxr-xr-x. 1 root root 103 Mar 10 05:09 string.js
-rw-r--r--. 1 root root  84 Mar 10 05:09 text.txt

環境変数

env.js

#!/usr/bin/jjs

print($ENV.USER);

$ENV で環境変数が参照できます。

実行結果

# ./env.js
root

標準入力の読み込み

readline.js

#!/usr/bin/jjs

var name = readLine("What is your name? ");
print("Hello, ${name}!");

readline 関数で標準入力を読み込めます。

実行結果

# ./readline.js
What is your name? Bob
Hello, Bob!

'What is your name?'の後ろの 'Bob' がキーボードからの入力です。

テキストファイルの読み込み

readfully.js

readFully 関数でテキストファイルを読み込めます。

#!/usr/bin/jjs

var text = readFully("text.txt");
print(text);

実行結果

This is the contents of the text.txt file located in the current working directory.

以上ですが、まぁ ここ
Nashorn and Shell Scripting
を試したみた感じです。


Rhino に比べ大分便利になっている感じです。パフォーマンスはどうなのか分かりませんが。。

地味に Rhino にはお世話になってきましたが、 Nashorn も今後利用してみたいところです。