在java 的基础上增量学习 shell 编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java 的基础上增量学习 shell 编程相关的知识,希望对你有一定的参考价值。


 shell 脚本其实还是我们比较常用的,在开发中经常会有需求,要写脚本实现某某功能。

 比如,别人让写一个告警脚本,将消息推送到钉钉上。

 这篇文章作为shell 的入门吧。

  java程序只能操作JVM虚拟机,虚拟机是在 操作系统下的,而 shell 脚本直接操作的操作系统,就是命令行操作。

 

# # 开篇思想

 还是要用增量的学习方式,如果你学过编程语言,那就不要从零开始学shell编程了。

 我们明明可以建立起联系。我是用的 java 语言做的开发,所以,我在学习shell 的时候,跟java建立联系,然后找出来差异的地方特殊记忆。

 

# #   井底之娃

 我看到shell 的神奇的地方就是,觉得:我们可以在 shell 脚本 里边写一堆系统命令,然后执行。正是因为这点,它可以让我们实现很多自动化的功能。

  感觉 shell 最强大的地方就是它是用来直接操作系统的。直接对操作系统进行指挥。而我们知道,java是运行在虚拟机上的,虚拟机是在操纵系统上的。我们的java 操作的只能是 虚拟机,而shell则是直接在 JVM赖以生存的环境上进行操作的。 

  另外我觉得shell 最强大的一个地方在于,你可以直接把一条命令的运行结果赋值给一个变量,这是我们java不能做到的。

  举一个简单的例子:我们知道 linux 里边 cat 是查看命令,我们想要查看一个文件的内容,则可以 cat  fileName.txt

  看我们的shell 脚本可以执行这条命令,并且赋值给变量:注意符号 不是单引号,也不是双引号。而是键盘左上角第一列,第二个键上的。

在java

  

 

# #  java 编程和 和 shell 如何建立联系

  首先,既然都是编程,那就会有很多相似的地方。比方说变量,方法,类。 java 是面向对象的语言。而在 shell 里边没有面向对象的概念。但是既然要编程,是不是就需要有方法,其实 一个脚本,我觉得就可以简单的理解为一个java的类,java的入口是main方法。而在 shell脚本里边的内容,就相当于是写在main方法里边的内容。 java 通过 run 来启动。而 shell 通过 sh ./shellName.sh  就可以直接启动。

  只要是编程,不管是 java ,还是任何一个语言,基本上都离不开的是 方法,这个“方法”说的是java里边的概念,而在shell里边叫做函数。刚在将了,一个shell 脚本里边的内容,就相当于是一个main方法。既然是方法,那就应该会有入参的概念,就是通过输入的内容,进行处理。

   这个入参有很多形式传进去,其中最像方法入参的就是在启动脚本的时候在后边跟上就可以了,多个以 空格相隔:

   例如: sh  ./shellDemo.sh   hello 

   其中 hello,就是我传的第一个入参的值,在shell脚本里边直接使用就可以了。 通过这样来取值: $1  

   而  $# ,是入参的个数。一般用于循环控制。

         $*  是拿到所有的入参,把所有的参数当一个主题

         $@   也是拿到参数,只不过,是一个一个的拿

         $?    这个可以知道上一条命令的执行结果,正确则返回0,也就是没有错误。其他数字则代表错误。

 

 

# # 变量

  这里边还是和 java 进行对比,Java中生命一个变量,需要指出它的类型: int   num = 1;

  这里特别的需要注意一下,因为习惯,在Java开发中,运算符我们习惯两边空格,但是 shell 里边不允许空格,而且它是弱类型的,就是不用指定类型, 比如: num=1;


# #  运算符

  因为特殊的原因,运算,并不像我们在java中那么简单的使用,我这里只写 shell 支持的,一种最简单最好用的运算符号

  就是使用 $[1 + 1]    这里注意一下,就是注意运算符左右必须有空格

  里边的内容随意替换,也可以进行我们的变量的替换,参数的替换,甚至是一条命令运算结果 作为运算内容进行运算。

  关于其他运算符的支持


 

# #  条件判断

  if [ 条件 ];then

     内容

  fi

 注意条件左右必须要有空格

 

# # for 循环

 这个和我们java 不一样的地方就是:两层括号 有do 和 done

for((i=0;i<10;i++))
 do
     echo $i

 done

  

第二种 for循环这样写

 for   i   in   1,2,3

  do

  echo $i

 done

  

# # 重要的命令 cut ,cut 命令是切割

  使用方式是 :  cut   -d  "#"   -f  2,3   file.txt

  其中 -d 是指定分割符号,就和我们java中的 split 方法一样,要传入根据什么分割。

  -f  是指定列,多个列用逗号分割 

  然后再指定文件

 

# # awk 也是切割

 

# # sed 命令

在java

  

在java

 注意几个点,这个也是按行来操作的。然后这个命令,可以为我们提供一个很好的添加的操作。比方说我们想要对结果添加一行内容,或者删除一行,或者删除包含某些内容的行。最后一个关键点,就是我们的本来的文件是不发生任何改变的。

  来个小例子:在第二行下边添加

在java

 再看一个删除:

在java

  

 再来一个替换:

在java

 多个条件:删除第二行,并将love 替换成 loveyou

在java

 

 

# #  sort

 排序

 可配置参数

在java

  使用: sort   -t  分隔符  -rnk  2  排序的文件 

  上边的命令就是,对要排序的文件,每行按照指定的分隔符切割, -rnk 2  ,是按照分割后的 第二列的内容进行倒序按照数字大小排序。

 

  

 

 

以上是关于在java 的基础上增量学习 shell 编程的主要内容,如果未能解决你的问题,请参考以下文章

简单 Shell编程学习

python 学习笔记 -- 数据结构与算法 希尔排序 Shell Sort

shell脚本编程学习笔记-shell脚本编程基础介绍

精讲shell基础以及如何高效的学习shell编程

Shell脚本基础学习

linux基础学习-17-linux操作系统之Shell编程基础讲解