写好Shell脚本,自动化部署就不愁了
做Java的肯定都接触过Linux系统,那么很多时候我们在开发的过程中都是把我们项目打成一个jar包,或者是war包的形式,然后通过XFTP上传到我们服务器的指定目录,然后运行一端启动脚本,让我们的项目变得可以访问就像./shservice.shstart然后启动我们写好的sh的shell脚本。接下来我们就来学习一下关于Shell脚本是如何写出来的。 Shell脚本Shell脚本是什么?Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,也就是说,我们用户每输入一条命令,Shell就会相对应的执行一条命令。当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。 在我们的Shell脚本中,会有各种各样的内容,赋值,计算,循环等一系列的操作,接下来我们就来看看这个Shell脚本怎么写吧 1.查看自己当前系统默认的Shell echo$SHELL 输出:/bin/bash 2.查看系统支持的Shell cat/etc/shells 输出: /bin/sh/bin/bash/usr/bin/sh/usr/bin/bash 也就是说,我们的云服务器是支持我们在这里给他安排Shell脚本的 Shell脚本怎么写出来的我们这时候先来安排一下sh的文件,创建一个文件夹,然后在其中创建一个sh的文件。 mkdir/usr/local/shelltest touchtest.sh 创建完成我们编辑一下内容 vimtest.sh #!/bin/bashecho"HelloWorldShell" 然后我们出来运行一下我们的Shell的第一个脚本 bashtest.sh 出来的结果是HelloWorldShell 一个及其简单的脚本出现了,接下我们就分析一波我们写了点啥? #!/bin/bash #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell 我们在之前也使用了echo$SHELL来查看了自己系统默认的是哪一种sh解析器,之前看到的是/bin/bash,所以我们在写Shell脚本的时候,我们在开头默认的约定中,我们写了这个是用/bin/bash来进行解释的, 那么我们如何像之前调用我们的当前目录中的Shell脚本一样去调用他呢?就像这个样子的./shservice.shstart 1.授权, 我们先不授权试一下看看能通过./test.sh进行调用么 bash:./test.sh:Permissiondenied会提示这个,也就是没有授权定义, 授权命令:chmod+xtest.sh 2.执行./test.sh 然后调用就能正常输出了,就是说,在当前的目录下执行这个脚本命令。 Shell脚本的变量定义变量和使用变量命名实际上很简单,我们先来试一下 name=zhiyikeji 这时候我们怎么使用变量呢?实际上只要在前面加上一个符号就可以$ echo$name [root iZbp10j01t7sgfqekyefpoZ~]#echo$namezhiyikeji[root iZbp10j01t7sgfqekyefpoZ~]#echo${name}zhiyikeji上面的两种写法都是可以的,外面的大括号加和不加区别不大,可以省略,直接就$name就可以使用你定义的变量 使用括号的意义一般在于区别某些变量,比如你写了一串的内容,可能写的是echo$nameismyfriend,如果连在一起,是不是有点尴尬,这时候就可以使用括号区别一下,echo${name}ismyfriend不使用括号的时候,他就去找nameismyfriend这个变量了,就无法出来我们要的效果。 删除自己定义的变量unsetname 这时候我们就把我们刚才定义的name=zhiyikeji这个变量给去掉了,我们可以调用一下我们的变量看是什么? echo$name [root iZbp10j01t7sgfqekyefpoZ~]#unsetname[rootiZbp10j01t7sgfqekyefpoZ~]#echo$name这是不是就证明我们自己定义的变量已经删除了 只读变量那么我们需要一个关键字,大家肯定能想到是什么关键字readonly 我们先给name赋值,然后使用readonly设置只读,然后再改变一下试试, [root iZbp10j01t7sgfqekyefpoZ~]#name=zhiyikeji[rootiZbp10j01t7sgfqekyefpoZ~]#echo$namezhiyikeji[rootiZbp10j01t7sgfqekyefpoZ~]#readonlyname[rootiZbp10j01t7sgfqekyefpoZ~]#echo$namezhiyikeji[rootiZbp10j01t7sgfqekyefpoZ~]#name=ceshi-bash:name:readonlyvariable[rootiZbp10j01t7sgfqekyefpoZ~]#竟然是真的,如果不设置只读,是不是会重新可以进行赋值,我们测试个年龄, [root iZbp10j01t7sgfqekyefpoZ~]#age=10[rootiZbp10j01t7sgfqekyefpoZ~]#echo$age10[rootiZbp10j01t7sgfqekyefpoZ~]#age=20[rootiZbp10j01t7sgfqekyefpoZ~]#echo$age20所以我们就可以肯定,readonly就是设置只读的关键词,记住了么? 那么设置只读的变量可以删除么?毕竟总有杠精的面试官会提问这个棘手的问题,但是,阿粉试过的所有方式好像都是不行的,阿粉就直接重启了自己的服务器,这样临时的变量就不存在了! Shell脚本的流程控制说真的,Shell脚本的流程控制数一般才是yyds,为什么这么说,因为你在写大部分的脚本的时候,流程控制的地方永远是最多的,判断,选择,等等一系列的函数,当时熟练使用的时候,就发现这东西确实很有意思。 IF我们先说最简单的ifelse这也是我们最经常使用的判断,在写Shell脚本的时候,就不像我们的Java中直接写 if(...){}else{....} Xshell中的语法就不是这个样子的,Xshell语法: if...then...else...fi 末尾的fi就是if倒过来拼写,我们可以写一个if的脚本试一下这个流程能否理解。 #!/bin/bashif[$1-gt2];thenecho"值大于2"elseecho"值小于2"exitfi 这里申明一下, -ge标识的是大于等于符号; -le表示的是小于等于符号; -gt表示大于符号; -lt表示小于符号; -eq表示等于符号; -ne表示不等于符号; 我们在上面这段脚本中写就是内容就是,我们给脚本传入一个值,然后比对这个值和2的大小关系,然后输出我们指定的内容。 运行后就能看到 [root iZbp10j01t7sgfqekyefpoZshelltest]#shtest2.sh1值小于2[rootiZbp10j01t7sgfqekyefpoZshelltest]#shtest2.sh3值大于2$1表示我们给Shell脚本输入的第一个参数,$0就是你写的shell脚本本身的名字,$2是我们给Shell脚本传的第二个参数 大家在部署某些项目的时候,是不是启动命令就很简洁,就是shservice.shstart类似这种的,那我们来看看一般这种是怎么写的,这就用到了另外一块的内容,和if类似,在Java中也有,那就是Case. Case我们先来看看Case的语法, case...esac实际上就和Java中的Case是非常相似的,case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令.esac是一个结束的标志。 case值in匹配值1) |
转载请注明地址:http://www.tanhuaa.com/gjth/10944.html
- 上一篇文章: 人间最心痛的一首歌致有缘无分的你
- 下一篇文章: 利用pandas模块处理百家姓数据