Linux06-Shell编程

Shell编程:

1:Shell

Shell是一个命令行解释器,为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户使用Shell启动,挂起,停止,甚至编写一些程序。

脚本格式要求:

  1. 脚本以 #!/bin/bash 开头
  2. 脚本需要有可执行权限

脚本执行方式:

  1. 赋予脚本+x的执行权限,再执行脚本
[root@lkLinux01 testShell]# chmod u+x hello.sh   #为所有者添加执行权限


[root@lkLinux01 testShell]# ./hello.sh  #执行
hello,world

[root@lkLinux01 testShell]# /home/testShell/hello.sh  #执行
hello,world


[root@lkLinux01 testShell]# cat hello.sh 
#!/bin/bash
echo "hello,world"

2.sh+脚本,无需赋予x权限

[root@lkLinux01 testShell]# sh hello.sh  #执行
hello,world

2:Shell变量

  1. Linux的Shell变量分为两种:系统变量和用户自定义变量
  2. 系统变量:$HOME $PWD $SHELL $USER $PATH等 比如 echo $HOME
  3. 显示当前所有系统变量:set

自定义变量:

  1. 定义变量 变量名=值
  2. 撤销变量 unset 变量名
  3. 声明静态变量 readonly变量=值 静态变量不能unset
  1 #!/bin/bash
  2 echo "hello,world"
  3 #定义变量A
  4 A=100
  5 #输出变量需要加$
  6 echo "A=$A"
  7 echo A=$A
  8 #撤销变量A
  9 unset A
 10 echo A=$A
 11 #声明静态变量  不能unset
 12 readonly B=20
 13 echo B=$B

定义变量规则:

  1. 变量名称由字母,数字,下划线组成,不可以以数字开头
  2. 等号两侧不能存在空格
  3. 变量名称一般习惯为大写

将命令的返回值赋给变量:

A=`date` #将date函数的返回值赋给A
A=$(date) #将date函数的返回值赋给A

3:Shell设置环境变量

  1. export 变量名=变量值 (将Shell变量输出为环境变量/全局变量被全局文件共享)
  2. source配置文件(让修改后的配置信息生效)
  3. echo $变量名(查询环境变量的值)

Shell多行注释 :<<! !

4:位置参数变量

  1. 执行Shell脚本时,如果希望获取到命令行参数信息,就可以使用到位置参数变量。
  2. $n(n为数字,$0表示命令本身 1 − 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 1-9代表第一到第九个参数,十以上的参数需要用大括号包含 19{10})
  3. $*(变量代表命令行中所有的参数,将所有的参数看作一个整体)
  4. @ ( 变 量 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @(变量代表命令行中所有的参数,不过 @(@将每一个参数区别对待)
  5. $#(变量代表命令行中所有参数个数)
echo "命令本身为$0"
echo "参数1=$1 ,参数2=$2"
echo "所有参数为$*"
echo "所有参数为$@"
echo "参数个数为$#"

5:预定义变量

  1. shell设计者已经定义好的变量,可以直接在shell脚本使用。
  2. $$(当前进程PID)
  3. $!(后台运行的最后一个进程PID)
  4. $?(最后一次执行的命令的返回状态,如果变量值为0证明上一个命令正确执行,如果非0则上一个命令不正确)
echo "当前进程PID为 $$"
#一后台的方式运行一个脚本并获取进程号
/home/testShell/hello.sh &   #&以后台方式运行脚本
echo "最后一个后台方式运行的进程PID为 $!"
echo "最后一次执行命令的返回状态 $?"

6:运算符

  1. ( ( 运 算 符 ) ) ” “ ((运算符))” “ (())[运算符]” expr m + n expr中间需要空格
  2. expr m - n expr \ *为乘法 % /
  3. 如果想将计算结果为某个变量赋值 需要 ``反引号括起来
#计算(2+3)*4
#写法1
RES1=$(((2+3)*4))
echo $RES1
#写法2
RES2=$[(2+3)*4]
echo $RES2
#写法3
TEMP=`expr 2 + 3`
echo $TEMP
RES3=`expr $TEMP  \* 4`
echo $RES3

#计算参数1和参数2
RES4=$[$1 % $2] 
echo $RES4

7:条件判断

  1. [ condition ] (condition前后需要空格)
  2. 非空返回true 使用 $!验证 0为true >1为false
  3. [ condition ] && echo OK || echo notok 如果条件满足则执行后面的语句
命令功能
=判断字符串是否相等
-lt整数小于
-le整数小于等于
-eq整数等于
-gt整数大于
-ge整数大于等于
-ne整数不等于
-r文件有读取权限
-w文件有写权限
-x文件有执行权限
-f文件存在且为常规文件
-e文件存在
-d文件存在且为目录
#!/bin/bash
#判断ok等于ok
if [ "ok"="ok" ]
then 
	echo "equals"
fi


#23是否大于22
if [ 23 -ge 22 ]
then 
	echo "大于"
fi

#判断文件是否存在
if [ -e  /home/testShell/hello.sh ]
then
	echo "存在"
fi


#判断文件是否没有执行能力
if [ ! -x /home/testShell/hello.sh ]
then 	
	echo "不存在执行能力"
fi

8:流程控制

if语句:

if [ 条件判断式 ]

then

代码

fi

if [ 条件判断式 ]

then

代码

elif [ 条件判断式 ]

then

代码

fi

#!/bin/bash

if [ $1 -ge 60 ]
then 	
	echo "及格"
elif  [ $1 -lt 60  ]
then 
	echo "不及格"
fi

case语句:

case $变量 in

“值1”)

;;

“值2”)

;;

*)

不为上面的所有则执行此语句;;

esac

#!/bin/bash

case $1 in

"1")
echo "周一" ;;

"2")
echo "周二" ;;

"3")
echo "周三" ;;

"4")
echo "周四" ;;

"5")
echo "周五" ;;

"6")
echo "周六" ;;

"7")
echo "周天" ;;


*)
echo "星期八" ;;

esac

for循环:

for 变量 in 值1 值2 值3

do

程序

done

#!/bin/bash

echo "星的输出"

for i in "$*"
do echo "num is $i"
done 

echo "==========="

echo "猴头的输出"

for i in "$@"
do echo "num is $i "
done
[root@lkLinux01 testShell]# sh forTest.sh 4 2 1
星的输出
num is 4 2 1
===========
猴头的输出
num is 4 
num is 2 
num is 1 

for((初始值;循环控制条件;变量变化))

do

程序

done

SUM=0

for(( i=1; i<=$1; i++))
do
 SUM=$[ $SUM + $i ]
done

echo  "$SUM"

while循环:

while [ 条件判断式 ]

do

程序

done

#!/bin/bash 

SUM=0

i=0

while [ $i -le $1 ] 
do
        SUM=$[ $SUM + $i  ]
        i=$[ $i + 1 ]
done

echo "sum=$SUM"

9:read读取控制台输入

read[选项](参数)

命令功能
-p指定读取值时的提示符
-t指定读取值时等待的时间,如果未在等待时间内输入,则不等待
变量只当读取值的变量名
#!/bin/bash

#读入输入的NUM1
read -p "请输入NUM1=" NUM1
echo "NUM1=$NUM1"

#10s内读入NUM2
read -t 10 -p  "input NUM2=" NUM2
echo "NUM2=$NUM2"

10:函数

Shell分为系统函数和自定义函数。

系统函数命令功能
basename返回完整路径最后/的部分,常用于获取文件名
basename [pathname]{suffix}
basename[string]{suffix}删除所有前缀包括最后一个/字符 将字符串显示
suffix后缀,如果指定后缀则会删除string或者pathname的suffix部分
dirname返回完整路径最后/的前面部分,用于获取路径
自定义函数命令功能

基本语法:

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

调用: funname []


function getSum(){

	SUM=$[n1 + n2 ]
	
	echo "和为$SUM"
}

read -p "请输入一个数字n1=" n1
read -p "请输入一个数字n2=" n2

#调用自定义函数
getSum  $n1 $n2

[root@lkLinux01 testShell]# basename /home/testShell/testCase.sh #获取文件名字
testCase.sh

[root@lkLinux01 testShell]# basename /home/testShell/testCase.sh  .sh  #获取文件名且删除.sh后缀
testCase

[root@lkLinux01 testShell]# dirname /home/testShell/testCase.sh #返回路径部分
/home/testShell		

10:Shell编程综合

1:每天2:30备份数据库 到 /data/backup/mysqldb

2:备份开始和备份结束给出相应的提示信息

3:备份后的文件要求按照时间为文件名,打为.tar.gz 2022-03-28_XXXX.tar.gz

4:备份同时检测是否有十天前的数据有则删除

crond定时调用脚本,脚本负责操作。

[root@lkLinux01 mysqlDB]# crontab -l
30 2 * * * /usr/sbin/mysql_db_backup.sh

将脚本编写到usr/sbin目录下。

#!/bin/bash


#备份的目录
BACKUP=/data/backup/mysqlDB


#获取当前时间
DATE=$(date +%Y-%m-%d_%H%M%S)

#数据库相关信息
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PWD=root123456
#备份的数据库名
DATABASE=lkTest


#创建备份目录
[ ! -d "${BACKUP}/$DATE" ]  && mkdir -p  "${BACKUP}/${DATE}" 

#备份数据库
mysqldump -u${DB_USER} -p${DB_PWD} --host=${HOST} -q -R  --databases ${DATABASE}  | gzip  > ${BACKUP}/${DATE}/$DATE.sql.gz

#将文件打包文tar.gz
cd ${BACKUP}
#将整个文件夹打包
tar -zcvf $DATE.tar.gz  ${DATE}
#删除对应备份目录
rm -rf ${BACKUP}/${DATE}

#删除10天前的备份文件
#按照10天前查找 按照名字查找
find ${BACKUP} -atime +10 -name "*.tar.gz"  -exec rm -rf {} \;


echo "备份mysql成功"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值