在腳本中運行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