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;
# # 运算符
因为特殊的原因,运算,并不像我们在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 命令
注意几个点,这个也是按行来操作的。然后这个命令,可以为我们提供一个很好的添加的操作。比方说我们想要对结果添加一行内容,或者删除一行,或者删除包含某些内容的行。最后一个关键点,就是我们的本来的文件是不发生任何改变的。
来个小例子:在第二行下边添加
再看一个删除:
再来一个替换:
多个条件:删除第二行,并将love 替换成 loveyou
# # sort
排序
可配置参数
使用: sort -t 分隔符 -rnk 2 排序的文件
上边的命令就是,对要排序的文件,每行按照指定的分隔符切割, -rnk 2 ,是按照分割后的 第二列的内容进行倒序按照数字大小排序。
标签:脚本,shell,java,虚拟机,编程,我们,里边 From: https://blog.51cto.com/u_15812686/5739742