Scala入门到精通——第三十节 Scala脚本编程与结束语
2018-06-26 17:43
495 查看
摘要: 本节主要内容 REPL命令行高级使用 使用Scala进行Linux脚本编程 结束语 1. REPL命令行高级使用 在使用REPL命令行时,有时候我们需要粘贴的代码比较大,而普通的粘贴可能会些一些问题,比如中文粘贴会出现乱码、多行代码粘贴时会出错,此时需要用到REPL的高级功能。在日常开发过程中,我们粘贴多行代码的时候会遇到下列问题: //本意是要粘贴下面两行代码本节主要内容REPL命令行高级使用
使用Scala进行Linux脚本编程
结束语
1. REPL命令行高级使用在使用REPL命令行时,有时候我们需要粘贴的代码比较大,而普通的粘贴可能会些一些问题,比如中文粘贴会出现乱码、多行代码粘贴时会出错,此时需要用到REPL的高级功能。在日常开发过程中,我们粘贴多行代码的时候会遇到下列问题:
![](http://dingyue.nosdn.127.net/8I4HJDa8RwWXTkvYJMDGDZixly440KSl=V704pLrBc1QD1530004959730.png)
而对于一些长串跨行的代码,可能会出现报错,例如:
![](http://dingyue.nosdn.127.net/4m2yRzRRybHW7j28RLrjqFymMGHaXq1G2MMPMb20p6nls1530004987052.png)
那要怎么办呢?在REPL命令行中执行下列命令:
![](http://dingyue.nosdn.127.net/gGdM0aCDElEj5E2T4mH9CdtWgYfhimOSQxW18fbC7NS601530005014814.png)
先输入:paste,然后按ctr+v键,可以正常粘贴内容,中文也不会出现乱码了:
![](http://dingyue.nosdn.127.net/iAYyOLfUMMXqLkaVvLPC8820bNu9n6LQxrsu1niydmX0u1530005041419.png)
另外,在实际开发过程中,有些人会认为这种处理方式非常繁琐,Scala的创建者也为我们考虑过这个问题了,我们也可以在scala IDE for eclipse (在Intellij IDEA 中也有这个功能) 里面利用REPL命令行,使用方式是创建scala worksheet,创建方式如下: 1 点击相应的包,然后右键,在new菜单中选择 scala worksheet
![](http://dingyue.nosdn.127.net/lo=hBhvJ8N67Nt7ACSU0QMYlNSSndNJDvdiMg4ZqwUXsB1530005172335compressflag.png)
2 在文件中输入相应的scala语句,worksheet会自动打印出相应的结果
![](http://dingyue.nosdn.127.net/CEhuUSKNJd4XMB1ez0zE2l82yqQ5mirv3=RbGUIo7HkVo1530005241849.png)
但是worksheet对中文的支持很不友好,例如下面的代码:
![](http://dingyue.nosdn.127.net/qHOaxtevEvYtVwksIzcCh5e4btyYBxWDAvtWMh6lpg6No1530005272379.png)
worksheet最终得到的中文是乱码,因此在实际进行语言特性测试的时候尽量避免中文scala中还有很多我们实际中没有接触过的命令,可以用 :help命令查看REPL现在支持的所有命令:
![](http://dingyue.nosdn.127.net/pq7sjsoLlkLvUSmx9mZAESPsELS95pFxAxIuiGrdhgiox1530005316564.png)
2. 使用Scala进行Linux脚本编程本节Linux脚本内容大部分来源于scala cookbook,部分经过本人修改以在Ubuntu Linux上进行演示。我们在第一节中提到,Scala不仅仅可以进行大规模分布式应用程序开发(例如Spark内存计算框架),也可以进行服务器端脚本编程即它可以替代Linux中的shell (Bourne Shell, Bash)或其它如 Perl, PHP, Ruby等可用于服务器端脚本编程的语言。下面给出的是一个简单示例(前提是要有linux操作系统,本节所有示例都是在ubuntu Linux下运行的):
![](http://dingyue.nosdn.127.net/aZ1oAfGIvrNgotJr2TDgRvmi3HSqYNuRx7P0r2RYpeSQu1530005367919.png)
将上面的内容保存为hello.sh文件,然后用下列命令增加其执行权限:
![](http://dingyue.nosdn.127.net/gSdtrfSGD2Z5LVhjVFSoGlLYR5FxqrdrDa8G6xkwFvB7J1530005396441.png)
可以看到我们第一个服务器脚本已经运行成功。前面的代码中,#!符号表示的是Unix shell脚本的开始,它会调用Unix Bourne shell。exce命令是内置的shell,表示需要执行scala 命令,其中0绑定的是hello.sh脚本名称,@ 绑定的是我们输入的参数。!#表示脚本声明头部的结束。在脚本中可以使用任何的scala语法,例如:
![](http://dingyue.nosdn.127.net/rHs1eWy7JcFphCzaqEFn7lpIDV5MCM7CUUDnvF1YZxMB01530005424182.png)
上述代码执行结果:
![](http://dingyue.nosdn.127.net/aI7vYXoxd40gpV9bHi6hRWd4zgMQRy4c1WEaSOQ5t2O1g1530005454806.png)
除此之外,我们还可以定义应用程序对象,可以扩展自App,也可以实现自己的Main方法,例如:
![](http://dingyue.nosdn.127.net/=yukigh9LDdhMqzspyIlosD97E9gPdXDb0SnLFuz3K4co1530005497957.png)
下面给出的是不带参数的执行结果:
![](http://dingyue.nosdn.127.net/3F=H2Anr7=OyrbJa62=xWvTUK5IwgtY7NMISxp=7A5CjI1530005529294.png)
下面给出的是带参数的执行结果,如:
![](http://dingyue.nosdn.127.net/9JVzVnGb8Zkyo0yG2R8Iz6WVeunVar9qkFRCKqvKuHR=d1530005556673.png)
当然,还可以实现自己的main方法,如:
![](http://dingyue.nosdn.127.net/pyGsJi8lTiRtIGHNLLTntBL5EB8bz0ZNx3Ezmf9zxzs4N1530005586399.png)
同extends App是一样的。如果脚本中需要应用到第三方库的话,可以采用下列方式进行包引入:
![](http://dingyue.nosdn.127.net/DwAz8p1ZyNzHztyHqU1x9zQK812R=ctU1jyEc5HH0hGSQ1530005654977.png)
![](http://dingyue.nosdn.127.net/yh1bKUx2gAGh51HAoHZOVgPfb1Uqv4DTa=0RrE5H4DdKU1530005695794.png)
![](http://dingyue.nosdn.127.net/PRQNQcl5oJM5unwWVz7KN9DjqnKwKOBYcOX27rC=TTSV91530005725841.png)
![](http://dingyue.nosdn.127.net/Ejav0OMBfti3X2H8tqBC14MTbmVTa6PU8hGGPFHAMrGGj1530005759092.png)
通过上述代码不难发现,脚本编程与一般的Scala应用程序开发有着非常多的相似之处,不同之处仅在于在脚本编程需要加入下面这样的样板代码
![](http://dingyue.nosdn.127.net/J6LudG8ABgAescLmoRovnxMIMT53MOTZk=7pUbCTxCeYW1530005798706.png)
有时候,我们也需要对命令行参数进行捕获(例如判断命令行的个数或输入的参数类型等),然后进行相应的操作,前面已经演示了如何打印输出命令行参数,这里我们更多实际中可能会遇到的一些经典案例:
1 判断输入参数的个数,不满足要求则给出提示
![](http://dingyue.nosdn.127.net/RVacmJ8Hit=CW5DdFTUxdwioAlJAgrbKkN67Gz7ZWwmET1530005826394.png)
执行结果如下:
![](http://dingyue.nosdn.127.net/lI9xAoLRpMVF4FR04GFI9NccHqKGEdrBKeJGuk25fIpdT1530005852483.png)
2 交互式命令行,提示用户输入
![](http://dingyue.nosdn.127.net/naGoGXJ9HdAXAK=nJ47=6sj0Wq8Kq8phU1wI7ABUIAw1q1530005879280.png)
下面给出的是其执行结果:
![](http://dingyue.nosdn.127.net/9yI0HzemsJ0QxMkaCwXK85lbik9CtUtw=rhAzHVO7dDSx1530005906444.png)
3 加速代码的执行:
scala脚本在执行的过程中,也是通过编译、执行的步骤来进行的,有时候为加速脚本的执行,意图是将编译后的脚本保存下来,在执行时候如果脚本创建之后没有发生变化的话,则直接使用以前编译好的脚本。实现方式是在脚本声明的时候用-savecompiled。
![](http://dingyue.nosdn.127.net/Dsln1F5wOBXJV6XzMezhrLmzUhDteRG6B6X1l=jTpL8eN1530005931793.png)
它的原理是在代码第一次执行后,生成相应的jar文件,当下次再执行的便调用该jar文件来执行,第一次执行后生成的jar文件如下:
![](http://dingyue.nosdn.127.net/F14A1I48MdZnSBriSLX6tBsjCT8NaQARBCoNIjXWdUtSn1530005985017.png)
3. 结束语本节内容是scala入门到精通系列课程的最后一节,通过本课程,我相信可以让大家成为一个中级scala语言开发者。Scala语言功能非常强大,其中内容还有很多,还有许多内容我们没有涉及,例如scala 的GUI编程、Scala的定界延续等,但这些功能在实际开发中应用的并不是特别广泛,特别是Scala GUI编程,我们知道java在GUI编程方面并不是它的强项,scala语言也是如此。这门课程的目的是让大家学完之后能够快速上手spark应用程序开发,希望在学完本课程之后,大家将这门课作为自己学习scala的起点,而非终点。原文链接
使用Scala进行Linux脚本编程
结束语
1. REPL命令行高级使用在使用REPL命令行时,有时候我们需要粘贴的代码比较大,而普通的粘贴可能会些一些问题,比如中文粘贴会出现乱码、多行代码粘贴时会出错,此时需要用到REPL的高级功能。在日常开发过程中,我们粘贴多行代码的时候会遇到下列问题:
![](http://dingyue.nosdn.127.net/8I4HJDa8RwWXTkvYJMDGDZixly440KSl=V704pLrBc1QD1530004959730.png)
而对于一些长串跨行的代码,可能会出现报错,例如:
![](http://dingyue.nosdn.127.net/4m2yRzRRybHW7j28RLrjqFymMGHaXq1G2MMPMb20p6nls1530004987052.png)
那要怎么办呢?在REPL命令行中执行下列命令:
![](http://dingyue.nosdn.127.net/gGdM0aCDElEj5E2T4mH9CdtWgYfhimOSQxW18fbC7NS601530005014814.png)
先输入:paste,然后按ctr+v键,可以正常粘贴内容,中文也不会出现乱码了:
![](http://dingyue.nosdn.127.net/iAYyOLfUMMXqLkaVvLPC8820bNu9n6LQxrsu1niydmX0u1530005041419.png)
另外,在实际开发过程中,有些人会认为这种处理方式非常繁琐,Scala的创建者也为我们考虑过这个问题了,我们也可以在scala IDE for eclipse (在Intellij IDEA 中也有这个功能) 里面利用REPL命令行,使用方式是创建scala worksheet,创建方式如下: 1 点击相应的包,然后右键,在new菜单中选择 scala worksheet
![](http://dingyue.nosdn.127.net/lo=hBhvJ8N67Nt7ACSU0QMYlNSSndNJDvdiMg4ZqwUXsB1530005172335compressflag.png)
2 在文件中输入相应的scala语句,worksheet会自动打印出相应的结果
![](http://dingyue.nosdn.127.net/CEhuUSKNJd4XMB1ez0zE2l82yqQ5mirv3=RbGUIo7HkVo1530005241849.png)
但是worksheet对中文的支持很不友好,例如下面的代码:
![](http://dingyue.nosdn.127.net/qHOaxtevEvYtVwksIzcCh5e4btyYBxWDAvtWMh6lpg6No1530005272379.png)
worksheet最终得到的中文是乱码,因此在实际进行语言特性测试的时候尽量避免中文scala中还有很多我们实际中没有接触过的命令,可以用 :help命令查看REPL现在支持的所有命令:
![](http://dingyue.nosdn.127.net/pq7sjsoLlkLvUSmx9mZAESPsELS95pFxAxIuiGrdhgiox1530005316564.png)
2. 使用Scala进行Linux脚本编程本节Linux脚本内容大部分来源于scala cookbook,部分经过本人修改以在Ubuntu Linux上进行演示。我们在第一节中提到,Scala不仅仅可以进行大规模分布式应用程序开发(例如Spark内存计算框架),也可以进行服务器端脚本编程即它可以替代Linux中的shell (Bourne Shell, Bash)或其它如 Perl, PHP, Ruby等可用于服务器端脚本编程的语言。下面给出的是一个简单示例(前提是要有linux操作系统,本节所有示例都是在ubuntu Linux下运行的):
![](http://dingyue.nosdn.127.net/aZ1oAfGIvrNgotJr2TDgRvmi3HSqYNuRx7P0r2RYpeSQu1530005367919.png)
将上面的内容保存为hello.sh文件,然后用下列命令增加其执行权限:
![](http://dingyue.nosdn.127.net/gSdtrfSGD2Z5LVhjVFSoGlLYR5FxqrdrDa8G6xkwFvB7J1530005396441.png)
可以看到我们第一个服务器脚本已经运行成功。前面的代码中,#!符号表示的是Unix shell脚本的开始,它会调用Unix Bourne shell。exce命令是内置的shell,表示需要执行scala 命令,其中0绑定的是hello.sh脚本名称,@ 绑定的是我们输入的参数。!#表示脚本声明头部的结束。在脚本中可以使用任何的scala语法,例如:
![](http://dingyue.nosdn.127.net/rHs1eWy7JcFphCzaqEFn7lpIDV5MCM7CUUDnvF1YZxMB01530005424182.png)
上述代码执行结果:
![](http://dingyue.nosdn.127.net/aI7vYXoxd40gpV9bHi6hRWd4zgMQRy4c1WEaSOQ5t2O1g1530005454806.png)
除此之外,我们还可以定义应用程序对象,可以扩展自App,也可以实现自己的Main方法,例如:
![](http://dingyue.nosdn.127.net/=yukigh9LDdhMqzspyIlosD97E9gPdXDb0SnLFuz3K4co1530005497957.png)
下面给出的是不带参数的执行结果:
![](http://dingyue.nosdn.127.net/3F=H2Anr7=OyrbJa62=xWvTUK5IwgtY7NMISxp=7A5CjI1530005529294.png)
下面给出的是带参数的执行结果,如:
![](http://dingyue.nosdn.127.net/9JVzVnGb8Zkyo0yG2R8Iz6WVeunVar9qkFRCKqvKuHR=d1530005556673.png)
当然,还可以实现自己的main方法,如:
![](http://dingyue.nosdn.127.net/pyGsJi8lTiRtIGHNLLTntBL5EB8bz0ZNx3Ezmf9zxzs4N1530005586399.png)
同extends App是一样的。如果脚本中需要应用到第三方库的话,可以采用下列方式进行包引入:
![](http://dingyue.nosdn.127.net/DwAz8p1ZyNzHztyHqU1x9zQK812R=ctU1jyEc5HH0hGSQ1530005654977.png)
![](http://dingyue.nosdn.127.net/yh1bKUx2gAGh51HAoHZOVgPfb1Uqv4DTa=0RrE5H4DdKU1530005695794.png)
![](http://dingyue.nosdn.127.net/PRQNQcl5oJM5unwWVz7KN9DjqnKwKOBYcOX27rC=TTSV91530005725841.png)
![](http://dingyue.nosdn.127.net/Ejav0OMBfti3X2H8tqBC14MTbmVTa6PU8hGGPFHAMrGGj1530005759092.png)
通过上述代码不难发现,脚本编程与一般的Scala应用程序开发有着非常多的相似之处,不同之处仅在于在脚本编程需要加入下面这样的样板代码
![](http://dingyue.nosdn.127.net/J6LudG8ABgAescLmoRovnxMIMT53MOTZk=7pUbCTxCeYW1530005798706.png)
有时候,我们也需要对命令行参数进行捕获(例如判断命令行的个数或输入的参数类型等),然后进行相应的操作,前面已经演示了如何打印输出命令行参数,这里我们更多实际中可能会遇到的一些经典案例:
1 判断输入参数的个数,不满足要求则给出提示
![](http://dingyue.nosdn.127.net/RVacmJ8Hit=CW5DdFTUxdwioAlJAgrbKkN67Gz7ZWwmET1530005826394.png)
执行结果如下:
![](http://dingyue.nosdn.127.net/lI9xAoLRpMVF4FR04GFI9NccHqKGEdrBKeJGuk25fIpdT1530005852483.png)
2 交互式命令行,提示用户输入
![](http://dingyue.nosdn.127.net/naGoGXJ9HdAXAK=nJ47=6sj0Wq8Kq8phU1wI7ABUIAw1q1530005879280.png)
下面给出的是其执行结果:
![](http://dingyue.nosdn.127.net/9yI0HzemsJ0QxMkaCwXK85lbik9CtUtw=rhAzHVO7dDSx1530005906444.png)
3 加速代码的执行:
scala脚本在执行的过程中,也是通过编译、执行的步骤来进行的,有时候为加速脚本的执行,意图是将编译后的脚本保存下来,在执行时候如果脚本创建之后没有发生变化的话,则直接使用以前编译好的脚本。实现方式是在脚本声明的时候用-savecompiled。
![](http://dingyue.nosdn.127.net/Dsln1F5wOBXJV6XzMezhrLmzUhDteRG6B6X1l=jTpL8eN1530005931793.png)
它的原理是在代码第一次执行后,生成相应的jar文件,当下次再执行的便调用该jar文件来执行,第一次执行后生成的jar文件如下:
![](http://dingyue.nosdn.127.net/F14A1I48MdZnSBriSLX6tBsjCT8NaQARBCoNIjXWdUtSn1530005985017.png)
3. 结束语本节内容是scala入门到精通系列课程的最后一节,通过本课程,我相信可以让大家成为一个中级scala语言开发者。Scala语言功能非常强大,其中内容还有很多,还有许多内容我们没有涉及,例如scala 的GUI编程、Scala的定界延续等,但这些功能在实际开发中应用的并不是特别广泛,特别是Scala GUI编程,我们知道java在GUI编程方面并不是它的强项,scala语言也是如此。这门课程的目的是让大家学完之后能够快速上手spark应用程序开发,希望在学完本课程之后,大家将这门课作为自己学习scala的起点,而非终点。原文链接
相关文章推荐
- Scala入门到精通——第三十节 Scala脚本编程与结束语
- Scala入门到精通——第三十节 Scala脚本编程与结束语
- 第三十节 Scala脚本编程与结束语
- Scala入门到精通——第七节:类和对象(二)
- Scala入门到精通——第十四节 Case Class与模式匹配(一)
- Scala入门到精通——第十五节 Case Class与模式匹配(二)
- Scala入门到精通——第二十四节 高级类型 (三)
- Scala入门到精通——第十二节 I/O与正则表达式
- Scala入门到精通——第二十九节 Scala数据库编程
- Scala入门到精通——第十七节 类型参数(一)
- Scala入门到精通
- Scala入门到精通——第二十三节 高级类型 (二)
- Scala入门到精通——第二十七节 Scala操纵XML
- Scala入门到精通——第十二节 I/O与正则表达式
- Scala入门到精通——第二十八节 Scala与JAVA互操作
- Scala入门到精通——第一节 Scala语言初步
- Scala入门到精通——第三节 Array、List
- Scala入门到精通——第二十四节 高级类型 (三)
- Scala入门到精通——第二十六节 Scala并发编程基础
- Scala入门到精通—— 第二节Scala基本类型及操作、程序控制结构