shell 是一个命令行解释器,它为用户提供了一个向 linux 内核发送请求,以便运行程序的界面系统级程序。用户可以使用 shell 来启动、挂起、停止甚至编写一些程序。
①、脚本以 #!/bin/bash
开头。
②、脚本需要有可执行权限。
# 输入shell 脚本的绝对路径或相对路径的方式,执行shell脚本
# 首先 需要对 shell 脚本 赋执行权限
chmod 744 test_shell.sh
# 相对路径的方式执行
./test_shell.sh
# 绝对路径的方式执行
/usr/myshell/test_shell.sh
使用该方式不需要 赋予shell脚本执行权限,直接执行即可。
sh ./test_shell2.sh
shell 的变量分为:系统变量 和 用户自定义变量。
系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等
# 输出系统变量
echo "path = $PATH"
echo "user = $USER"
# 定义变量: 变量=值,示例:
A=100
# 撤销变量: unset 变量, 示例:
unset A
# 声明静态变量:readonly 变量。注意:静态变量不能 unset。示例:
readonly B=101
# 把变量提升为全局环境变量,可供其他shell程序使用。
定义变量的规则
- ① 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
- 等号两侧不能有空格。
- 变量名称一般习惯为大写。
# 两种方式
# 方式一:反引号,运行里面的命令,并把结果返回给变量。示例:
A=`ls -la`
# 方式二:等同于反引号。示例:
A=$(ls -la)
环境变量所在文件:
1.系统级:
2.用户级(这些文件处于家目录下):
# 基本语法
# 将 shell 变量输出为环境变量
export 变量名=变量值
# 让修改后的配置信息立即生效
source 配置文件
# 查询环境变量的值
echo $变量名
# 示例:
export TOMCAT_HOME=/opt/tomcat
# 生效
source /etc/profile
当我们执行一个 shell 脚本时,某些场景需要获取到执行 shell脚本的命令行参数信息,那么就可以使用位置参数变量。
基本语法:
命令 | 功能说明 |
---|---|
$n | n 为数字,$0 代表命令本身,$1- 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9代表第一个到第九个参数,十以上的参数需要用大括号包含,例:{10} |
$* | 代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | @ 也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过@把每个参数区分对待 |
$# | 代表命令行中所有参数的个数 |
[root@myCentos6 zim]# vim test.sh
#!/bin/bash
echo "获取并打印命令行参数"
echo "$0 $1 $2"
echo "打印全部参数: $*"
echo "打印全部参数-> $@"
echo "参数个数 = $#"
[root@myCentos6 zim]# ls -l
总用量 4
-rw-r--r--. 1 root root 154 8月 28 11:45 test.sh
[root@myCentos6 zim]# chmod 744 test.sh
[root@myCentos6 zim]# ls -l
总用量 4
-rwxr--r--. 1 root root 154 8月 28 11:45 test.sh
[root@myCentos6 zim]# ./test.sh aa 100
获取并打印命令行参数
./test.sh aa 100
打印全部参数: aa 100
打印全部参数-> aa 100
参数个数 = 2
[root@myCentos6 zim]#
预定义变量,就是 shell 脚本设计者事先已经定义好的变量,可以直接在shell脚本中使用。预定义变量是一开始执行Script脚本时就会设定,且不能被修改,预定义变量当一执行程序时就有了。
基本用法:
$$ :当前进程的进程号PID。
$! :后台运行的最后一个进程的进程号pid。
$? :最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数字,由命令自己决定),则证明上一个命令执行错误。
# 基本语法
# 方式一: $((运算式)) 示例:
RESULT=$((2+3)*4)
echo "result=$RESULT"
# 方式二: $[运算式] 示例:
RESULT=$[(2+3)*4]
echo "result=$RESULT"
# 求两个参数的和
SUM=$[$PARAM1+$PARAM2]
# 方式三: expr m+n 注意:expr 运算符间要有空格
# expr \*,/,% 分别代表 乘,除,取余
TEMP=`expr 2 + 3`
RESULT=`expr $TEMP \* 4`
echo "result=RESULT"
# 判断语句,基本语法. 注意:condition 前后要有空格
# 非空返回 true,可使用 $? 验证(0 为 true, >1 为 false)
[ condition ]
# 应用实例: [ test_condition ] 返回true
[ test_condition ]
# [] 返回false
[]
# 条件满足,执行后面的语句
[ condition ] && echo "ok" || echo "not ok"
# 案例:"ok 是否等于 ok"
if [ "ok100" = "ok" ]
then
echo "equal"
fi
# 案例:/root/install.log 目录中的文件是否存在
if [ -e /root/install.log ]
then
echo "文件存在"
fi
常用判断条件
# 基本语法
if [ 条件判断式 ];then
程序
fi
# 或者 基本语法 (推荐使用)
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
注意事项:[ 条件判断式 ] ,中括号和条件判断式之间必须有空格。
# 基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
… 省略其他分支 …
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
# 应用示例:命令行参数是 1时,输出"周一",是2时输出"周二",其他情况输出"other"
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
# 基本语法1
for 变量 in 值1 值2 值3…
do
程序
done
# 示例: 打印命令行输入的参数
#!/bin/bash
for i in "$*"
do
echo "the param is $i"
done
# 或
for j in "$@"
do
echo "the num is $j"
done
# 基本语法2
for ((初始值;循环控制条件;变量变化))
do
程序
done
# 示例:从1加到100 的值,输出显示
#!/bin/bash
SUM=0
for((i=1.i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
# 基本语法1
while[ 条件判断式 ]
do
程序
done
# 应用示例:从命令行输入一个数n,统计从1+…+ n 的值是多少
#!/bin/bash
SUM=0
i=0
while[ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum= $SUM"
# 基本语法
read [选项] [参数]
# 常用选项
-p : 指定读取值时的提示符
-t : 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不等待
# 常用参数
变量:指定读取值的变量名
# 应用实例1: 读取控制台输入的 num 值 并打印
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "您输入的值时num1=$NUM1"
# 应用实例2: 读取控制台输入的 num 值,在10秒内输入,并打印
#!/bin/bash
read -t 10 -p "请输入一个数num2=" NUM2
echo "您输入的值时num2=$NUM2"
shell 编程和其他编程语言一样,有系统函数,也可以自定义函数。
# basename 函数功能:返回完整路径最后 / 的部分,常用于获取文件名
# suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
basename [pathname] [suffix]
# 应用示例: 返回/home/aaa/test.txt 的 "test"部分
basename /home/aaa/test.txt .txt
# 应用示例: 返回/home/aaa/test.txt 的 "test.txt"部分
basename /home/aaa/test.txt
# dirname 函数功能:返回完整路径最后 / 的前面部分,常用于返回路劲部分
# 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回目录部分。
dirname 文件绝对路径
# 应用实例: 返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
# 基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
# 调用直接写函数名: funname [值]
# 应用实例:计算输入两个参数的和 (read),getSum
#!/bin/bash
function getSum() {
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2
getSum $n1 $n2
需求:
① 每天凌晨 2:10 备份数据库 myDb 到 /data/backup/db
② 备份开始和备份结束,能够给出相应的提示信息
③ 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2023-08-28_230201.tar.gz
④ 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
在 /usr/sbin 目录下创建 mysql_db_backup.sh 脚本
vim /usr/sbin/mysql_db_backup.sh
编写 mysql_db_backup.sh 脚本
#!/bin/bash
# 备份的路径
BACKUP=/data/backup/db
# 当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "==开始备份数据库myDb=="
echo "==备份的路径是 $BACKUP/$DATETIME.tar.gz=="
# 主机
HOST=localhost
# 用户名
DB_USER=root
# 密码
DB_PWD=root
# 备份数据库名称
DATABASE=myDB
# 创建备份的路径
# 如果备份的路径文件夹存在就直接使用,否则就创建
[ ! -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 "==备份文件成功=="
crontab 设置定时任务
10 2 * * * /usr/sbin/mysql_db_backup.sh
.