Linux中的Shell编程

Linux中的Shell编程

shell编程快速入门

为什么要学习Shell编程?
1.Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
2.对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
3.对于大数据程序员来说,需要编写Shell程序来管理集群。

Shell是什么?
Shell 是一个命令解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
在这里插入图片描述

Shell编程快速入门?
进入Linux终端,编写一个 Shell 脚本 hello.sh :

#!/bin/bash 
echo 'hello world!'

在这里插入图片描述

使用vim命令可以直接创建并编写一个文件。如下图:
在这里插入图片描述

运行:

# 方法1
sh hello.sh

# 方法2
sudo chmod +x hello.sh
./hello.sh

在这里插入图片描述
在这里插入图片描述
从上面的两张图片中可以看出,每种方式都会成功输出hello world!

说明:

  • #! 告诉系统这个脚本需要什么解释器来执行。
  • 文件扩展名 .sh 不是强制要求的。
  • 方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
  • 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。

Shell变量

定义
Shell 变量分为系统变量自定义变量。系统变量有$HOME, $PWD, $USER等,如下图:
在这里插入图片描述
像上面这些都是系统变量,我们可以通过set显示所有的系统变量,如下图:
在这里插入图片描述
比如我们还可以输出一下系统变量BASH的值,如下图:
在这里插入图片描述

像上面都是linux当中的系统变量,但在linux中我们用的比较多的还是自定义变量,自定义变量的基本语法

  • 定义变量:变量名=变量值,等号两侧不能有空格,变量名一般习惯用大写
  • 删除变量:unset 变量名 。
  • 设置只读变量:readonly 变量名,相当于设置了只读,其实也就是说变量值第一次设置之后后续就不能修改了。
  • 使用变量:$变量名

定义一个shell脚本test2.sh测试变量的使用,如下图:
在这里插入图片描述
执行shell脚本的结果如下图:
在这里插入图片描述
还有一个点需要注意一下,当我使用sh test2.sh执行shell脚本的时候,第二个B变量没有输出出来,如下图:
在这里插入图片描述
因此使用./test2.sh命令执行shell脚本,要比使用sh test2.sh命令执行脚本要强大的,以后尽量使用./test2.sh的方式执行shell脚本。

位置参数变量

基本语法

  • $n:$0代表的是命令本身、$1-$9代表从第1个参数到第9个参数,10以上参数用花括号 ${10}
  • $*:命令行所有参数,且把所有参数看成一个整体
  • $@:命令行中所有参数,且把每个参数区分对待
  • $#:所有参数个数

实例如下图:
在这里插入图片描述
执行test5.sh这个shell脚本的结果如下图:
在这里插入图片描述
注意$0的时候并不会把参数也输出。

运算符

基本语法

  • $((运算式))或 $[运算式]
  • expr m + n 注意expr运算符间需要有空格,如果希望将expr的结果赋值给某个变量,需要使用反引号,如TEMP=`expr 2 + 3`
  • expr \* , /, %分别代表乘,除和取余,注意这里的乘的符号比较特殊

定义一个test3.sh案例如下:
在这里插入图片描述
执行test3.sh这个shell脚本的结果,如下图:
在这里插入图片描述

条件判断

基本语法

# [ condition ] 注意condition前后要有空格。非空返回0,0为true,否则为false。
# 可能出现的情况大致如下
if [ 条件表达式 ]
then
	程序
fi

if [ 条件表达式 ]
then
	程序
else
	程序
fi

if [ 条件表达式 ]
then
	程序
elif [ 条件表达式 ]
then
	程序
else
	程序
fi

编写一个test4.sh例子,如下图:
在这里插入图片描述
运行test4.sh这个shell脚本的结果如下图:
在这里插入图片描述

case分支

基本语法

case $变量名 in

值1)
程序1
;;

值2)
程序2
;;

值3)
程序3
;;

*)
如果变量值不等于上面列出的所有列,则执行此处程序
;;

esac

例子如下图:
在这里插入图片描述
测试test6.sh这个shell脚本的执行结果,如下图:
在这里插入图片描述

for循环

基本语法

# 语法1
for 变量名 in 值1 值2 值3...
do
	程序
done


# 语法2
for ((i=1;i<=100;i++)
do
	程序
done

实例如下图:
在这里插入图片描述
test7.sh这个shell脚本的运行结果如下图:
在这里插入图片描述

while循环

基本语法

while [ 条件判断式 ]
do
	程序
done

实例输出1加到100的值,如下图:
在这里插入图片描述
test8.sh这个shell脚本文件执行结果如下图:
在这里插入图片描述

函数

和其它编程语言一样,Shell 编程有系统函数和自定义函数。

系统函数
第一个系统函数是basename函数,这个函数可获取绝对路径下面最后面的文件名字;
第二个系统函数是dirname函数,这个函数可获取绝对路径下文件的路径,其实也就是去掉了后面的文件名字;
使用如下图:
在这里插入图片描述
一个是用来获取文件名,一个是用来获取文件的项目路径。

自定义函数
基本语法

function funcname(){
	Action;
	[return int;]
}

实例如下图:
在这里插入图片描述
执行test9.sh这个shell脚本的结果如下图:
在这里插入图片描述

shell编程里面的函数可以加参数吗?
与大部分编程语言不同,Shell 中函数在定义时不能指定参数,但在调用时可以传递参数。传递参数给函数:在函数名后面以空白分隔给定参数列表即可,如:testfunc arg1 arg2 … ; 在函数体中当中,可使用$1, 2 , … 调用这些参数;还可以使用 2, …调用这些参数;还可以使用 2,调用这些参数;还可以使用@, $*, $#等特殊变量。

函数后面传递参数的例子,如下图:
在这里插入图片描述
接着执行我们的test10.sh这个shell脚本,看看执行结果是什么,如下图:
在这里插入图片描述

nohup命令

基本概念

nohup 命令 用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由Command 参数和任何相关的Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用nohup 命令运行后台中的程序。要运行后台中的nohup 命令,添加& ( 表示”and”的符号)到命令的尾部。

nohup指不断地运行,是no hup up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。什么意思呢?就是使用nohup在linux上启动一个部署的项目之后,即便你退出重新登录linux服务器了,服务器上面的项目也是启动状态的,不用你重新启动了就。

个人理解:先理解成nohup是用来运行程序jar包的,如果我们想要在windows上面启动一个程序,那么我们直接在idea里面点运行就行了,但是在linux上面我们如果想要启动一个程序要怎么办呢?可以直接使用命令 java -jar 程序jar包,如下图:
在这里插入图片描述
可以发现我们启动的时候启动参数错了,这是为什么呢?来看一下我们启动主类中的代码,如下图:
在这里插入图片描述
那么我们启动程序的时候怎么配置启动参数呢?以及JVM的启动参数堆内存栈内存等?可以使用nohup进行启动,在命令后面直接跟上启动参数就行了,如下图:
在这里插入图片描述

当上面的shell脚本启动之后,就可以在linux上面启动我们的程序了。因此,shell脚本在linux上面可以用来启动linux上面部署的项目。

使用eval命令把其中一个文件里面的配置输出到另外一个shell脚本的变量里面

首先我们创建一个file.txt文件,内容如下图:
在这里插入图片描述
接下来我们在shell脚本里面可以通过eval命令直接把这个文件中的变量输入到shell脚本对应的变量中,我们创建一个test9.sh脚本,内容如下图:
在这里插入图片描述
当我们执行上面的shell脚本的时候,输出的三个变量值,其实就是我们在file.txt文件里面定义的三个变量值,输出结果如下图:
在这里插入图片描述
可以发现这里脚本执行的结果是和file.txt文件中配置的信息一致的。

特别注意shell脚本里面不要关闭其它web项目的进程

使用shell脚本启动一个项目的时候,如果当前项目已经启动了,那么需要先查出来当前项目的进程号id,然后把这个进程杀死;注意查询进程id的时候,要加上当前项目的特征,比如可以在grep后面直接加上当前项目的jar包,用来进行筛选,如下图:
在这里插入图片描述
使用 ps -ef | grep 你的项目特征 | grep -v grep | awk ‘{print $2}’ 命令可以筛选出来你的项目的进程号,如下图:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-X~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值