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}’ 命令可以筛选出来你的项目的进程号,如下图:
在这里插入图片描述

本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr-X~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值