Linux–shell脚本

1.Shell是什么

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

2.Shell编程快速入门

1)脚本以#!/bin/bash开头
2)脚本需要有可执行权限
常见一个Shell脚本,输出hello world!

[root@localhost shell]# cat myShell2.sh
#!/bin/bash
echo "hello,wrold!"
chmod 744

执行方式1:

[root@localhost shell]# chmod o+x myShell2.sh
[root@localhost shell]# ./myShell2.sh
hello,wrold!

方式2:不用赋予脚本权限,直接执行命令:

[root@localhost shell]# chmod o-x myShell2.sh
[root@localhost shell]# sh myShell2.sh
hello,wrold!
3.Shell的变量

系统变量:$HOME$PWD$SHELL$USER等等
显示Shell中所有变量
set
样例2:
shell脚本如下:

#!/bin/bash
#echo "hello,wrold!"
echo "PATH=$PATH"
echo "user=$USER"

测试:

[root@localhost shell]# sh myShell2.sh
PATH=/opt/jdk1.7.0_79/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
user=root
4.Shell变量的定义

基本语法:
1)定义变量:变量=值
2)撤销变量:unset 变量
3)声明静态变量:readonly变量,注意,不能unset
案例1:定义变量A和输出变量A

shell脚本如下:
#!/bin/bash
A=100
echo "A=$A"

运行结果如下:

[root@localhost shell]# sh myShell2.sh
A=100

案例2:销毁变量A

#!/bin/bash
A=100
echo "A=$A"
unset A
echo "A=$A"

运行结果:

[root@localhost shell]# sh myShell2.sh
A=100
A=

案例3:声明静态的变量B=2,不能unset

#!/bin/bash
readonly A=99
echo "A=$A"
unset A
echo "A=$A"

测试运行:

[root@localhost shell]# sh myShell2.sh
A=99
myShell2.sh: line 4: unset: A: cannot unset: readonly variable
A=99
5.定义变量的规则

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2)等号两侧不能有空格
3)变量名称一般习惯为大写

6.将命令的返回值赋给变量

1)A=ls-la反引号,运行里面的命令,并把结果返回给变量A
2)A=$(ls-la)等价于反引号

#!/bin/bash
RESULT='ls -l /home'
echo $RESULT
echo ""
MY_DATE=$(date)
echo $MY_DATE

测试结果如下:

[root@localhost shell]# sh myShell2.sh
ls -l /home

20200731日 星期五 09:03:51 CST
7.设置环境变量

基本语法
export变量名=变量值(功能描述:将shell变量输出为环境变量)
source配置文件(功能描述:让修改后的配置信息立即生效)
echo $变量名(功能描述:查询环境变量的值)
快速入门
1)在/etc/profile文件中定义TOMCAT_HOME环境变量
#定义一个环境变量

TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME

2)查看环境变量TOMCAT_HOME的值

[root@localhost shell]# source /etc/profile
[root@localhost shell]# echo $TOMCAT_HOME
/opt/tomcat

3)在另外一个shell程序中使用TOMCAT_HOME

#!/bin/bash
echo "tomcathome=$TOMCAT_HOME"

输出shell

[root@localhost shell]# sh myShell2.sh
tomcathome=/opt/tomcat

注意:在输出TOMCAT_HOME环境变量前,需要让其生效source /etc/profile
多行注释:

:<<!
RESULT='ls -l /home'
echo $RESULT
echo ""
MY_DATE=$(date)
echo $MY_DATE
!
8.位置参数变量

介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如:./myshell.sh100 200 ,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息
基本语法
$n(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)$#(功能描述:这个变量代表命令行中所有参数的个数)
位置参数变量
应用实例
案例:编写一个shell脚本positionPara.sh,在脚本中获取到命令行的各个参数信息。
输入shell脚本如下:

#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"

运行结果如下:

[root@localhost shell]# sh positionPara.sh 30 60
positionPara.sh 30 60
30 60
30 60
2
9.预定义变量

基本介绍
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$(功能描述:当前进程的进程号(PID))
$!(功能描述:后台运行的最后一个进程的进程号(PID))
$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)应用实例在一个shell脚本中简单使用一下预定义变量
应用实例
在一个shell脚本中简单使用一下预定义变量

#!/bin/bash
echo "当前进程号=$$"
./myShell2.sh &
echo "后台最后一个进程号=$!"
echo "执行的值=$?"

运行结果:

[root@localhost shell]# sh perVar.sh
当前进程号=9370
后台最后一个进程号=9371
执行的值=0
[root@localhost shell]# tomcathome=/opt/tomcat
10.运算符

基本语法
1)“$((运算式))”或“$[运算式]
2)expr m + n
注意expr运算符间要有空格
3)expr m-n
4)expr *, /, %乘,除,取余
应用实例
案例1:计算(2+3)X4的值
1)$((运算符))

#!/bin/bash
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"

执行结果如下:

[root@localhost shell]# sh demo.sh
result1=20

2)$[运算符]
脚本如下

#!/bin/bash
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"

运行结果如下:

[root@localhost shell]# sh demo.sh
result2=20

3)expr
shell脚本如下:

#!/bin/bash
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"

运行结果如下:

[root@localhost shell]# sh demo.sh
result3=20

案例2:请求出命令行的两个参数[整数]的和
shell脚本如下:

#!/bin/bash
RESULT4=$[$1+$2]
echo "result4=$RESULT4"

运行测试:

[root@localhost shell]# sh demo.sh 1 2
result4=3
11.条件判断

基本语法
[ condition ](注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
应用实例
[ atguigu ] 返回true
[] 返回false
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句

12.判断语句

•常用判断条件
1)两个整数的比较
=字符串比较
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
按照文件权限进行判断
-r有读的权限
-w有写的权限
-x有执行的权限
3)按照文件类型进行判断
-f文件存在并且是一个常规的文件
-e文件存在
-d文件存在并是一个目录
应用实例
案例1:"ok"是否等于"ok"判断语句
脚本如下:

#!/bin/bash
if [ "ok" = "ok" ]
	then    echo "equals"
fi

运行结果如下:

[root@localhost shell]# sh judge.sh
equals

案例2:23是否大于等于22判断语句
脚本如下

#!/bin/bash
if [ 22 -gt 22 ]
then
        echo "大于"
fi
if [ 22 -eq 22 ]
then
        echo "等于"
fi

运行结果如下:

[root@localhost shell]# sh judge.sh

等于
案例3:/home/shell/aaa.txt目录中的文件是否存在判断语句

#!/bin/bash
if [ -e /home/shell/aaa.txt ]
then
        echo "存在"
fi

运行测试结果如下:

[root@localhost shell]# touch aaa.txt
[root@localhost shell]# sh judge.sh

存在

13.流程控制

基本语法
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then 程序
elif [ 条件判断式 ]
then
程序
fi
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出"及格了",如果小于60,则输出"不及格"
脚本代码如下:

#!/bin/bash
if [ $1 -ge 60 ]
	then echo "大于60"
 elif [ $1 -lt 60 ]
	then echo "小于60"
fi

运行结果如下:

[root@localhost shell]# sh testIf.sh 1
小于60
14.case语句

case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例1:当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出"other"
脚本如下:

#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
esac

运行结果如下:

[root@localhost shell]# sh caseTest.sh
other
[root@localhost shell]# sh caseTest.sh 1
周一
[root@localhost shell]# sh caseTest.sh 2
周二
[root@localhost shell]# sh caseTest.sh 3
other
15.for循环的第一种方式

for变量in值1值2值3…
do
程序
done
案例1:打印命令行输入的参数
脚本如下:

#!/bin/bash
for i in "$*"
	do
		echo "the num is $i"
	done

运行测试如下:

[root@localhost shell]# sh testFor.sh 1 2 3
the num is 1 2 3

方式2

#!/bin/bash
for i in "$@"
	do
		echo "$i"
	done

运行结果如下:

[root@localhost shell]# sh testFor2.sh 2 3
2
3
16.for循环的第二种方式

for((初始值;循环控制条件;变量变化))
do
程序
done
案例1:从1加到100的值输出显示[这里可以看出 ∗ 和 *和 @的区别]

#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
	SUM=$[$SUM+$i]
done
echo "sum=$SUM"
[root@localhost shell]# sh testFor3.sh
sum=5050
17.while循环基本语法1

while[条件判断式]
do
程序
done
案例1:从命令行输入一个数n,统计从1+…+ n的值是多少?

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
	do 
		SUM=$[$SUM+$i]
		i=$[$i+1]
	done
echo "sum=$SUM"
[root@localhost shell]# sh testWhile.sh 2
sum=3
18.read读取控制台输入

基本语法
read(选项)(参数)选项:
-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。参数
变量:指定读取值的变量名
案例1:读取控制台输入一个num值

#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"
[root@localhost shell]# sh testRead.sh
请输入一个数num1=23
你输入的值是num1=23

案例2:读取控制台输入一个num值,在10秒内输入。

#!/bin/bash
read -t 10 -p "请输入一个数num2=" NUM2
echo "你输入的值是num1=$NUM2"
[root@localhost shell]# sh testRead2.sh
请输入一个数num2=23
你输入的值是num1=23
19.系统函数

basename基本语法
功能:返回完整路径最后/的部分,常用于获取文件名
basename[pathname] [suffix]
basename [string] [suffix]
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
•应用实例
案例1:请返回/home/aaa/test.txt的"test.txt"部分

[root@localhost ~]# basename /home/aaa/test.txt
test.txt
[root@localhost ~]# basename /home/aaa/test.txt .txt
test
[root@localhost ~]# basename /home/aaa/
aaa

dirname基本语法
功能:返回完整路径最后/的前面的部分,常用于返回路径部分
案例1:请返回/home/aaa/test.txt的/home/aaa

[root@localhost ~]# dirname /home/aaa/test.txt
/home/aaa
20.自定义函数

•基本语法[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
案例1:计算输入两个参数的和,getSum
shell脚本如下:

#!/bin/bash
function getSum(){
	SUM=$[$n1+$n2]
	echo "和是=$SUM"
}
read -p "请输入第一个数n1:" n1
read -p "请输入第二个数n2:" n2

getSum $n1 $n2
[root@localhost ~]# sh functionTest.sh
请输入第一个数n1:12
请输入第二个数n2:12
和是=24
21.需求分析

1)每天凌晨2:10备份数据库atguiguDB到/data/backup/db
2)备份开始和备份结束能够给出相应的提示信息
3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:
2018-03-12_230201.tar.gz
4)备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
脚本代码如下:

#!/bin/bash
BACKUP=/home/learn/shell
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo $DATETIME
echo "=================开始备份================"
echo "=================备份的路径是$BACKUP/$DATETIME.tar.gz"
HOST=localhost
DATABASE=test
DB_USER=mysql
DB_PWD=1234567890
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
/usr/local/mysql/bin/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
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=======备份文件成功======"

配置定时

[root@localhost shell]# crontab -e
10 2 * * * /home/learn/shell/mysql_db_backup.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值