为什么要学习Shell编程?
1.Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
2.对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
3.对于大数据程序员来说,需要编写Shell程序来管理集群。
Shell是什么?
Shell 是一个命令解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
Shell编程快速入门?
进入Linux终端,编写一个 Shell 脚本 hello.sh :
#!/bin/bash
echo 'hello world!'
运行:
# 方法1
sh hello.sh
# 方法2
sudo chmod +x hello.sh
./hello.sh
从上面的两张图片中可以看出,每种方式都会成功输出hello world!
说明:
定义
Shell 变量分为系统变量和自定义变量。系统变量有$HOME, $PWD, $USER等,如下图:
像上面这些都是系统变量,我们可以通过set显示所有的系统变量,如下图:
比如我们还可以输出一下系统变量BASH的值,如下图:
像上面都是linux当中的系统变量,但在linux中我们用的比较多的还是自定义变量,自定义变量的基本语法:
定义一个shell脚本test2.sh测试变量的使用,如下图:
执行shell脚本的结果如下图:
还有一个点需要注意一下,当我使用sh test2.sh执行shell脚本的时候,第二个B变量没有输出出来,如下图:
因此使用./test2.sh命令执行shell脚本,要比使用sh test2.sh命令执行脚本要强大的,以后尽量使用./test2.sh的方式执行shell脚本。
基本语法
实例如下图:
执行test5.sh这个shell脚本的结果如下图:
注意$0的时候并不会把参数也输出。
基本语法
定义一个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 $变量名 in
值1)
程序1
;;
值2)
程序2
;;
值3)
程序3
;;
*)
如果变量值不等于上面列出的所有列,则执行此处程序
;;
esac
例子如下图:
测试test6.sh这个shell脚本的执行结果,如下图:
基本语法
# 语法1
for 变量名 in 值1 值2 值3...
do
程序
done
# 语法2
for ((i=1;i<=100;i++)
do
程序
done
实例如下图:
test7.sh这个shell脚本的运行结果如下图:
基本语法
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 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上面部署的项目。
首先我们创建一个file.txt文件,内容如下图:
接下来我们在shell脚本里面可以通过eval命令直接把这个文件中的变量输入到shell脚本对应的变量中,我们创建一个test9.sh脚本,内容如下图:
当我们执行上面的shell脚本的时候,输出的三个变量值,其实就是我们在file.txt文件里面定义的三个变量值,输出结果如下图:
可以发现这里脚本执行的结果是和file.txt文件中配置的信息一致的。
使用shell脚本启动一个项目的时候,如果当前项目已经启动了,那么需要先查出来当前项目的进程号id,然后把这个进程杀死;注意查询进程id的时候,要加上当前项目的特征,比如可以在grep后面直接加上当前项目的jar包,用来进行筛选,如下图:
使用 ps -ef | grep 你的项目特征 | grep -v grep | awk ‘{print $2}’ 命令可以筛选出来你的项目的进程号,如下图: