做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[root

iZbp10j01t7sgfqekyefpoZ~]#echo$name

这是不是就证明我们自己定义的变量已经删除了

只读变量

那么我们需要一个关键字,大家肯定能想到是什么关键字readonly

我们先给name赋值,然后使用readonly设置只读,然后再改变一下试试,

[root

iZbp10j01t7sgfqekyefpoZ~]#name=zhiyikeji[root

iZbp10j01t7sgfqekyefpoZ~]#echo$namezhiyikeji[root

iZbp10j01t7sgfqekyefpoZ~]#readonlyname[root

iZbp10j01t7sgfqekyefpoZ~]#echo$namezhiyikeji[root

iZbp10j01t7sgfqekyefpoZ~]#name=ceshi-bash:name:readonlyvariable[root

iZbp10j01t7sgfqekyefpoZ~]#

竟然是真的,如果不设置只读,是不是会重新可以进行赋值,我们测试个年龄,

[root

iZbp10j01t7sgfqekyefpoZ~]#age=10[root

iZbp10j01t7sgfqekyefpoZ~]#echo$age10[root

iZbp10j01t7sgfqekyefpoZ~]#age=20[root

iZbp10j01t7sgfqekyefpoZ~]#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[root

iZbp10j01t7sgfqekyefpoZshelltest]#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