在脚本中运行Scala、在脚本中使用Scala的高级特性、如何让Scala脚本快速运行shell
Scala又一强大的功能就是能够以脚本的形式运行。咱们能够建立一个测试文件scala_shell_1_test.sh,内容以下:apache
#!/bin/shbash
exec scala -savecompiled "$0" "$@"ide
!#函数
println("Hello, Welcome to http://www.iteblog.com!")测试
args.foreach(println)spa
/*命令行
经过savecompiled命令能够将这个scala_shell_1_test.sh脚本编译成scala_shell_1_test.sh.jar包scala
而后每次经过下面的命令就能够省去编译步骤,直接执行blog
scala -cp /Users/michael/scala_shell_1_test.sh.jar Main a c d*/
而后咱们就能够下面之一的方式运行这个Scala脚本:
[iteblog@www.iteblog.com iteblog]$ sh scala_shell_1_test.sh
Hello, Welcome to http://www.iteblog.com!
或者
[iteblog@www.iteblog.com iteblog]$ chmod 744 scala.sh
[iteblog@www.iteblog.com iteblog]$ ./scala.sh a b c
Hello, Welcome to http://www.iteblog.com!
a
b
c
上面两种运行方式就像运行shell脚本同样,彻底不须要知道里面是Scala代码。
须要注意的是,在运行上述脚本必须事先配置好Scala环境,也就是能够在命令行里面直接用scala命令:
能够将下面的内容加到你home目录的.bashrc文件里面或者是/etc/profile里面
SCALA_HOME=/home/iteblog/scala-2.10.4
PATH=$PATH:$SCALA_HOME/bin
若是你须要传参到Scala脚本里面,能够将代码修改为:
#!/bin/sh
exec scala "$0" "$@"
!#
args.foreach(println)
上述代码的第二行中的$0和$@分别获取脚本的名称和参数。args的类型是List[String],因此咱们可使用List的全部方法,好比args.length,args.getClass等,全部传进脚本的参数均可以经过args变量获取。
参考:http://www.iteblog.com/archives/1544
-------------------------------
在脚本中使用Scala最大的好处就是能够在脚本中使用Scala的全部高级特性,好比咱们能够在脚本中定义和使用Scala class,以下:
#!/bin/sh
exec scala -savecompiled "$0" "$@"
!#
case class Iteblog(var site: String) {
override def toString = site
}
println(Iteblog("http://www.ioteblog.com"))
运行这个脚本能够输出http://www.ioteblog.com。
咱们也能够在脚本中使用main函数:
#!/bin/sh
exec scala -savecompiled "$0" "$@"
!#
object HelloIteblog {
def main(args: Array[String]) {
println("Hello" + args.mkString(","))
}
}
HelloIteblog.main(args)
定义main函数和正常的写法同样,只不过咱们须要使用HelloIteblog.main(args)的形式调用这个main函数。
不少时候,咱们编写程序的时候每每是须要依赖外部的类。由于在脚本里面可使用全部Scala的特性,因此咱们也能够在脚本中指定须要依赖的jar包,使用方法以下:
#!/bin/sh
exec scala -classpath "/Users/michael/.m2/repository/commons-lang/commons-lang/2.6/commons-lang-2.6.jar" "$0" "$@"
!#
import org.apache.commons.lang.StringUtils
println(StringUtils.trim(" ab c "))
println(StringUtils.trim(" ab c ").length)
咱们能够看出,这些使用和编写正常的Scala脚本很相似。
参考:http://www.iteblog.com/archives/1547
-------------------------------
文件test.sh
#!/bin/sh
exec scala -savecompiled "$0" "$@"
!#
println("Hello, iteblog!!")
args foreach println
运行这个脚本,咱们能够发现第一次运行的速度仍是很慢,可是当程序运行完,咱们能够在同一目录下发现一个名为test.sh.jar
的jar文件,这就是编译以后的class文件。第二次运行的时候,Scala会检查该脚本是否修改了,若是没有修改,会直接使用以前编译好的test.sh.jar文件,因此之后运行速度会很快.
咱们能够看出这些就是编译后的class文件,咱们能够经过scala命令去运行里面的类:scala -cp /Users/michael/scala_shell_class_2_test.sh.jar Main