1)Linux运维工程师在进行服务器集群管理时,需要编写shell程序来进行服务器管理。
2)对于python或者其他程序员来说,工作的需要,可能需要编写一些shell脚本进行程序或者是服务器的维护,比如编写一个简单的定时备份数据库的脚本。
3)对于大数据程序员来说,需要编写shell程序来管理集群。
shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序。
1)脚本以#!/bin/bash开头
2)脚本需要你给一个执行权限
先创建一个shell脚本,输出hello eorld!过程代码如下:
创建一个shell脚本:
(base) [root@VM_0_17_centos home]# vim hjw.sh
编写一段简单的shell脚本:
#!/bin/bash
echo "hello,world!"
#echo 就相当于print 和printf或者java里面的System.out.println
#这个符号是注释的意思
# :<
# ! 这一起是多行注释的意思
编写完后要执行,而脚本的执行方式有两种
1)首先是 sh+脚本的方式,这种方式不用给予脚本x权限,直接执行就可以
(base) [root@VM_0_17_centos home]# sh ./hjw.sh
hello,world!
(base) [root@VM_0_17_centos home]#
2)给予脚本x的权限,然后直接执行脚本
(base) [root@VM_0_17_centos home]# chmod 744 hjw.sh
(base) [root@VM_0_17_centos home]# ./hjw.sh #这和c语言执行相似
hello,world!
1)Linux shell 中变量分为,系统变量和自定义变量。
2)系统变量例如: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、PATH等。
3)可以使用set显示所有变量
(base) [root@VM_0_17_centos home]# echo "PATH=$PATH"
PATH=/root/anaconda3/bin:/root/anaconda3/condabin:/root/julia-1.1.1/bin:/usr/java/jdk-13/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/opt/go/bin:/root/bin
基本语法和规则:
1)定义变量:变量=值
2)撤销变量:unset 变量
3)声明静态变量:readonly变量,这里就不能使用unset撤销了
4)变量名称可以由字母、数字和下划线组成,但是不能以数字开头
5)等号两侧不能有空格
6)变量名称一般习惯大写,就像java类名一样
下面我将上面的语法演示一遍:
#!/bin/bash
B=520 #定义变量
echo "B=$B"
unset B #撤销变量
echo "B=$B"
readonly C=1314 #定义静态变量
echo "C=$C"
运行结果:
(base) [root@VM_0_17_centos home]# chmod 744 liu.sh
(base) [root@VM_0_17_centos home]# ./liu.sh
B=520
B=
C=1314
有两种方式:
1)A=ls-la
反引号,运行里面的命令,并把结果返回给变量A
2)A=$(ls-la)等价于反引号
A=`ls -l /home|more`
echo $A
echo ""
B=$(date)
echo $B
运行结果:
(base) [root@VM_0_17_centos home]# ./liu.sh
total 72 -rw-r--r-- 1 root root 1436 Nov 1 13:45 111.txt drwxr-xr-x 2 root root 4096 Oct 17 18:07 1223 -rw-r--r-- 1 root root 394 Nov 1 14:12 1.tar.gz drwxr-xr-x 3 root root 4096 Oct 30 20:25 dir1 -rw-r--r-- 1 root root 122 Nov 1 13:28 dirl -rwxr--r-- 1 root root 527 Nov 2 13:46 helloworld.sh
Sat Nov 2 13:51:50 CST 2019
1)export 变量名=变量值 (将shell变量输出为环境变量)
2)souree 配置文件 (让修改的配置信息生效)
3)echo $变量名 (查询环境变量的值)
$n(功能描述:n为数字,$0代表是命令本身,$1- 9 代 表 第 一 道 第 九 参 数 , 十 以 上 的 参 数 用 大 括 号 , 如 9代表第一道第九参数,十以上的参数用大括号,如 9代表第一道第九参数,十以上的参数用大括号,如{10})
$*(这个变量代表命令行中所有参数,这个把所有参数看成一个整体)
@ ( 这 个 变 量 代 表 命 令 行 中 所 有 参 数 , 不 过 @(这个变量代表命令行中所有参数,不过 @(这个变量代表命令行中所有参数,不过@把每个参数区分对待)
$#(这个变量代表命令行中所有参数的个数)
下面写一段代码应用上面的实例
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"
运行结果:
(base) [root@VM_0_17_centos home]# ./liu.sh 520 1314
./liu.sh 520 1314
520 1314
520 1314
参数个数=2
预定义变量就是shell设计者事先已经定义好了的变量,可以直接在shell脚本中使用
基本语法:
$$(当前进程的进程号(PID))
$!(后台运行的最后一个进程号)
$?(最后一次执行的命令的返回状态,如果是0,证明上个命令正确执行;如果这个变量的值非0,则证明上个命令执行不正确)
应用实例
echo "当前的进程号=$$"
./liu.sh &
echo "最后的进程的号=$!"
echo "执行的值=$?"
1)“ ( ( 运 算 式 ) ) ” 或 “ ((运算式))”或“ ((运算式))”或“[运算式]”
2)expr m+n
3)expr m-n
4)expr / ,% 除,取余
应用实例
A=$(((6+9)*8))
echo "A=$A"
B=$[(6+9)*8]
echo "B=$B"
C=`expr 6 + 9`
D=`expr $C \* 4`
echo "D=$D"
运行结果:
(base) [root@VM_0_17_centos home]# ./liu.sh
A=120
B=120
D=60
[ condition ] #非空返回true,可使用$?验证(0为true,>1为false)
例如 [ condition ] &&echo OK ||echo notok 条件满足,执行后面的语句
1)两个整数的比较
=字符串比较;-lt 小于;-le 小于等于;-eq 等于;-gt 大于;-ge 大于等于;-ne 不等于
2)按照文件权限进行判断
-r 可读的权限;-w 有可写的权限;-x 有执行的权限
3)按照文件类型分类
-f 文件存在并且是一个常规的文件;-e 文件存在;-d 文件存在并且是一个目录
应用实例
if [ 23 -gt 22 ]
then
echo "大于"
fi
运行结果:
(base) [root@VM_0_17_centos home]# ./liu.sh
大于
基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ] #括号和判断式之间必须有空格
then
程序
elif [ 条件判断式 ]
then
程序
fi
应用实例
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
运行结果
(base) [root@VM_0_17_centos home]# ./liu.sh 90
及格
case $变量名 in
“值1”)
如果变量值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值不是以上的值,则执行此程序
;;
esac
应用实例
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
运行结果
(base) [root@VM_0_17_centos home]# ./liu.sh 2
周二
10.3 for 循环
基本语法
for 变量 in 值1 值2 值3 …
do
程序
done
或者
for ((初始值;循环控制条件;变量变化))
do
程序
done
应用实例
for i in "$*"
do
echo "the num is $i"
done
echo "===================="
Sum=0
for (( i=1;i<=100;i++))
do
Sum=$[$Sum + $i]
done
echo "sum=$Sum"
运行结果:
(base) [root@VM_0_17_centos home]# ./liu.sh 1 2 3 4
the num is 1 2 3 4
====================
sum=5050
基本语法
while [ 条件判断式 ]
do
程序
done
应用实例
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[ $SUM + $i ]
i=$[ $i + 1 ]
done
echo "sum=$SUM"
运行结果
(base) [root@VM_0_17_centos home]# ./liu.sh 100
sum=5050
基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符;-t:指定读取时等待时间
变量:指定读取值得变量名
应用实例
read -p "请输入一个数num1=" NUM1
echo "num1=$NUM1"
read -t 10 -p "请输入一个数num2=" NUM2
echo "num2=$NUM2"
运行结果
(base) [root@VM_0_17_centos home]# ./liu.sh
请输入一个数num1=1
num1=1
请输入一个数num2=5
num2=5
shell编程和其他编程语言一样,有系统函数,有可以自定义函数。
系统函数:
basename基本语法:
功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix] (功能描述:basename命令会删除所有的前缀包括最后一个(‘/’))字符,然后将字符显示出来。
dirname基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
应用实例:
(base) [root@VM_0_17_centos dir1]# basename /home/dir1/home
home
(base) [root@VM_0_17_centos dir1]# dirname /home/dir1/home
/home/dir1
自定义函数
基本语法
[ function ] funname[0]
{
Action
[ return int;]
}
应用实例
function getSum(){
Sum=$[ $n1+$n2 ]
echo "和是=$Sum"
}
read -p "请输入一个数n1:" n1
read -p "请输入一个数n2:" n2
#调用getSum
getSum $n1 $n2
运行结果
(base) [root@VM_0_17_centos home]# ./liu.sh
请输入一个数n1:5
请输入一个数n2:6
和是=11
13.shell编程综合应用
#!/bin/bash
#完成数据库的定时备份。
#备份的路径
BACKUP=/home/liu1
#当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
#echo ${DATETIME}
echo "=======开始备份========"
echo "=======备份的路径是 $BACKUP/$DATETIME.tar.gz"
#主机
HOST=VM_0_17_centos
#用户名
DB_USER=root
#密码
DB_PWD=962831000hjw.
#备份数据库名
DATABASE=/home/111.txt
#创建备份的路径
#如果备份的路径文件夹存在,就使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行mysql的备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=====备份文件成功==========="
运行结果:
(base) [root@VM_0_17_centos home]# cd /home/liu1
(base) [root@VM_0_17_centos liu1]# ll
total 12
-rw-r--r-- 1 root root 179 Nov 4 13:27 2019_11_04_132725.tar.gz
-rw-r--r-- 1 root root 179 Nov 4 13:30 2019_11_04_133025.tar.gz
-rw-r--r-- 1 root root 181 Nov 4 13:38 2019_11_04_133812.tar.gz