首页 > 系统相关 >在java 的基础上增量学习 shell 编程

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

时间:2022-10-09 10:05:56浏览次数:52  
标签:脚本 shell java 虚拟机 编程 我们 里边


 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 的基础上增量学习 shell 编程_运算符

  

 

# #  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 的基础上增量学习 shell 编程_main方法_02

  

在java 的基础上增量学习 shell 编程_main方法_03

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

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

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

 再看一个删除:

在java 的基础上增量学习 shell 编程_main方法_05

  

 再来一个替换:

在java 的基础上增量学习 shell 编程_运算符_06

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

在java 的基础上增量学习 shell 编程_main方法_07

 

 

# #  sort

 排序

 可配置参数

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

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

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

 

  

 

 

标签:脚本,shell,java,虚拟机,编程,我们,里边
From: https://blog.51cto.com/u_15812686/5739742

相关文章

  • 【博学谷学习记录】超强总结,用心分享|Java基础分享-数据结构(数组、链表)
    目录1.数组2.链表2.1.链表简介2.2.链表分类2.2.1.单链表2.2.2.循环链表2.2.3.双向链表2.2.4.双向循环链表1.数组数组(Array) 是一种很常见的数据结构。......
  • java在图片上绘制框框
    /***画缺陷框的图片文件*@paramfile{@linkFile}*@parampolygon缺陷框*@return带缺陷的文件*@throwsIOExceptionIO异常*......
  • Java 多线程(一)线程简介
    多任务类似于这些例子,现实生活中太多太多了。看起来是多个任务在做,其实本质上我们的大脑再同一时间依旧只做一件事。 多线程  原来是一条路,慢慢的因为车多起来......
  • 微软全力拥抱 Java!
    作者|苏宓出品|CSDN(ID:CSDNnews)虽然一直以来,微软的不少产品在很多层面都有使用Java语言,但近日其官网上的一则「MicrosoftiscommittedtothesuccessofJavadev......
  • 插件化编程之WebAPI统一返回模型
      WebApi返回数据我们一般包裹在一个公共的模型下面的,而不是直接返回最终数据,在返回参数中,显示出当前请求的时间戳,是否请求成功,如果错误那么错误的消息是什么,状态码(根......
  • JavaScript基础 看这一篇就够了
    JavaScript是什么?JavaScript是世界上最流行的客户端脚本语言,主要用于为网页添加交互,跟html,css并称为前端三大语言。JavaScript能做什么?客户端数据验证客户端数据计算......
  • 用自己的编程语言实现了一个网站(增强版)
    前言前段时间在《用自己的编程语言实现了一个网站》用介绍了用GScript写的一个简单“网站”,虽然是打上引号的;页面长这样:看起来确实非常的挫,其实之前一直也想做一个G......
  • 对于Java课上问题的探究和解答
    问题一:子类和父类的继承关系(extends)需要强调的是,子类自动声明继承父类中的public和protected的成员其中,public成员,外界可以自由访问;private成员,外界无法进行访问;protec......
  • Java 数据类型 扩展
    publicclassDemo2{publicstaticvoidmain(String[]args){//整数拓展进制:二进制ob,十进制,8进制0,16进制0xinti=10;inti......
  • Java基本语法 SwitchCase
    SwitchCaseswitchcase语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。语法switchcase语句语法格式如下:switch(expression){casevalue:......