java执行shell脚本_容易混淆的基础问题:Scala+shell脚本近期随笔

前言:这些东西又有点太初级了,但是不总结也不行,比较晦涩的东西我做得也不够好,反而是基础的东西可能对一些朋友有帮助,我准备再建一个基础知识专栏,把内容分级放一下。


1.Scala的构造函数问题:

主构造函数和类结构体完美的融合在一起

在这种情况下,类结构体本身就是主函数的作用域,也就是说class Student {...}中...的部分就可以作为主构造函数的方法体被执行。

次构造必须调用主构造,次构造的名称为this(...),因此她们并不是平级关系,可以理解为一种继承关系。

同时主构造也可以用this(...)调用。

e.g.

有一个Object单例类,还有一个Class,以Object作为程序入口。

Student类

package 

Entrance Object

package 

结果为:

Hi Wallace, Your ID is R0000002

我们再来试试次构造:

修改Entrance Object为:

package 

运行结果如下:

Hi Wallace, Your ID is R0000002

Hi Trump, Your ID is P0000045

我们的本意如果是只显示Trump语句,这个执行结果就不满足预期,显然我们的主构造在多数情况下不应该写任何非所有构造都需要执行的语句。

无论如何,主构造必须是次要构造参数的最小子集,也就是说,只能把空参构造作为对其它构造共同代码段的进一步复用。而不能实现一个独立的空参构造,给定默认参数。

2.Scala访问权限控制的问题

Scala中也有public private protected,这三种权限,但值得一提的是,它与大部分OOP语言的三种访问控制权限都有差别。

就拿Scala亲切的老大哥JAVA来做对比。

JAVA中的访问权限,private,protected,public中,protected是默认权限。

Scala中的访问权限,private,protected,public中,public是默认权限。

private:

JAVA中的private和Scala的private一致,都代表只有该类的成员才可访问,这里的成员包含变量、方法、内部类。

protected:

JAVA中的protected代表只有同package下的成员可以访问,一个package下的成员可能有类、接口、抽象类等等。

显然JAVA中的protected访问权限是严格大于private的。

Scala的protected需要重点注意一下

Scala中的protected代表只有该类非内部类成员和该类的子类可以访问,也就是说,哪怕是内部类这样的成员,作为一个类,没有继承自该类,则不可访问。

所以Scala中的protected并不总是大于private的概念,两者权限的交集不同

public:

对于Sscala和JAVA而言,public都代表在程序中的任意位置可访问。

3.Shell脚本

Shell脚本作为一个linux命令的集合,值得基于linux系统做开发的开发者和用到linux的电子设备爱好者学习了解。

第一个需要消除的歧义就是:shell脚本语言是shell脚本语言,Shell语言是Shell语言,这两者是不同的。

shell脚本解决了常用的linux命令复用的问题。

shell脚本可以被传入参数执行,shell脚本中也可以写函数。

shell脚本的基础教程建议看这个:

Shell 编程快速入门 | 菜鸟教程​www.runoob.com
java执行shell脚本_容易混淆的基础问题:Scala+shell脚本近期随笔_第1张图片

值得一提的是shell脚本中的变量作用域问题:

通常而言OOP语言的变量作用域至少需要三种,类级、方法级和全局级

对应到JAVA中,就是一个类都能访问的成员变量、一个方法中申明的局部变量,和static的写在静态字节码区中的全局变量,全局变量在整个程序可访问。

当然这里也会诞生一些有趣的问题,比如一个JAVA变量可以申明为private static,那么它的访问权限是怎样呢?

答案是:在其他类中不可直接访问,但是写一个静态代码块即可访问。

这个问题不是我们今天的主题,也就点到为止。

言归正传,在shell脚本中,变量作用域分为全局、局部和环境级。

默认的shell脚本变量作用域是全局的,所以也许你会疑惑,为什么函数A中定义的变量,在B中直接使用不报错,这是由于变量是全局级的。

只要先定义后使用,就不会报错。

全局变量是在整个shell脚本范围内可以访问的变量,哪怕定义在函数中也是如此。

局部变量需要显式的申明,比如local a=1

当然首先申明局部变量要满足变量在某一函数中的条件,如果变量在shell脚本的最外层,申明就毫无意义

环境变量则是跨shell脚本都可访问的变量,可以写作export a=1

当然,我们也可以在任何时候将一个变量变为环境变量,即a=1 换行 export a

值得一提的是,环境变量当然也不是生命周期无穷的,在所有shell脚本进程关闭的时候,环境变量也会被系统清除

4.shell脚本中的变量问题:

shell脚本中的参数变量可以用C语言风格的方式访问,也就是写$1, $2, ..., $n即可访问。

我们有必要学习一下shell脚本特殊变量的含义,并且灵活的使用。

java执行shell脚本_容易混淆的基础问题:Scala+shell脚本近期随笔_第2张图片

首先细心地朋友已经注意到,shell脚本的参数是从1开始的,所以$0有截然不同的意义,是当前shell脚本的文件名。

$n已经在最开始提到过,但值得一提的是,shell脚本本身,和shell脚本中的函数都可以接收参数。

$#代表传递给shell脚本的参数个数,一般在遍历所有参数时会用到。

值得一提的是,良好的编码习惯对于shell脚本的编写尤为重要,如果不注明每个函数或者脚本的参数应该是什么,可读性就差得令人发指。

两种小技巧解决该问题:

1.直接写一个函数、脚本注释

比如

## func: sayHello
# $1: name of the guy we say hello to
function sayHello(){
   echo "Hello, $1!"
}

2.通过变量名和变量注释解决此问题

function sayHello(){
   # name of the guy we say hello to
   name=$1
   echo "Hello, $name!"
}

shell脚本的一些值得注意的问题我有空的时候多总结一下,不过教程我肯定不会全部写了,浪费时间而且也没有别人做的好。

你可能感兴趣的:(java执行shell脚本,java调用shell脚本)