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的类,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;
这一块的案例我就不敲了,可以看看这篇文章:https://blog.csdn.net/hanchao5272/article/details/86430142
# # 运算符
因为特殊的原因,运算,并不像我们在java中那么简单的使用,我这里只写 shell 支持的,一种最简单最好用的运算符号
就是使用 $[1 + 1] 这里注意一下,就是注意运算符左右必须有空格。
里边的内容随意替换,也可以进行我们的变量的替换,参数的替换,甚至是一条命令运算结果 作为运算内容进行运算。
关于其他运算符的支持,请看这篇文章:https://blog.csdn.net/hanchao5272/article/details/86430498
# # 条件判断
if [ 条件 ];then
内容
fi
注意条件左右必须要有空格
# # for 循环
这个和我们java 不一样的地方就是:两层括号 有do 和 done
for((i=0;i
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?