Shell:程序设计语言。命令行解释器,提供了向LInux内核发送请求以便运行程序的界面系统级程序。
功能之一:用shell脚本或命令,启动、挂起、停止甚至编写程序。
新建shell脚本文件:vim hello.sh (.sh为约定格式,不一定固定)
shell脚本内容以:#!/bin/bash
作为起始行;
执行方式1:赋予适用者该文件的执行权限:chmod u+x hello.sh
,后执行,./hello.sh
或利用绝对路径执行
执行法式2:无需权限,直接sh hello.sh
shell变量:系统变量/自定义变量
系统变量:$HOEM,$PATH,$USER,#SHELL,$PWD(显示当前shell中所有变量:set)
自定义变量:变量名=值,,撤销:unset变量,,声明静态变量:readonly变量(不可撤销)
脚本内返回变量需要:$变量名
自定义变量规则:
- 左侧变量名不能数字开头(可字母(规范大写),数字,下划线),“=”左右不能有空格
将一行命令的result赋给变量——加反引号:A=反引号data反引号 或使用小括号和$——A=$(data)
单行注释 # 多行注释 :<<! 注释内容 ! (:<<!当独一行 !单独一行)
设置环境变量:
语法:export 变量名=变量值 :将shell变量输出为环境变量/全局变量
设置环境变量:再文件 /etc/profile 中,export 变量名=值,后必须,,执行命令——source 配置文件(刷新配置文件)
如:在/etc/profile中输入export TOMCAT_HOME=/opt/tomcat 换行 export CLASSPATH=%TOMCAT_HOME%/bin
,保存退出,执行source /etc/profile
位置变量:./myshell.sh 10 20
10用来向脚本长度参数或数据
$0 :获取,执行脚本时文件名/绝对文件名;绝对路径可简写:./
$n:
1
−
9
表
示
1
到
第
9
个
参
数
,
10
以
上
用
1-9表示1到第9个参数,10以上用
1−9表示1到第9个参数,10以上用{10}表示
$#:获取当前脚本后参数个数
$*:获取当前脚本所有参数(将参数视为多个字符串)
$@:获取当前脚本所有参数(将参数是为不同独立的字符串)
预定义变量:shell设计者定义好的变量,可直接在shell脚本中使用。
$$:获取当前脚本进程号PID
$!:获取上一个后台工作的进程的进 程号PID
$?:获取上一个指令的执行状态(成功:0,失败:非0)返回值
$_:获取此前执行命令或脚本的最后一个参数
3种运算式:
(
(
运
算
式
)
)
,
((运算式)),
((运算式)),[ 运算式 ],expr m + n (mn之间要有空格,如果将结果付给变量,使用反引号括起来)
运算符: expr * / % :分别表示乘、除、取余,特殊情况,而在使用 反引号expr 2 \* 3 反引号
条件判断:
语法:[ 具体条件 ] ( 中括号的左右要有空格:和if要有,和条件要有 )非空返回true,$?验证
if判断开始,分支elif , fi结束,
case语句:
case $1 in “”) ;; “”) ;; *) ;;esac
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
for循环:
语法1:for in 值/变量 do 代码 done
#!/bin/bash
#打印命令行参数
for i in "$*"
do
echo "num is $i"
done
#$@:分别对待
echo "---------------"
for j in "$@"
do
echo "num is $j"
done
语法2:
#!/bin/bash
#1-100的和
sum=0
for(( i=1; i<=$1; i++ ))
do
sum=$[ $sum+$i ]
done
echo "sum=$sum"
流程控制:
#!/bin/bash
#1-100的和
sum=0
for(( i=1; i<=$1; i++ ))
do
sum=$[ $sum+$i ]
done
echo "sum=$sum"
注:变量是区分大小写的
read读取控制台输入
#!/bin/bash
read -t 10 -p "请输入数字:" NUM1
echo "你输入为:$NUM1"
-p : 给出提示(配合变量名)
-t: 设置从控制台读取的等待时间(过期自动执行其他代码)
函数:系统函数,自定义函数
系统函数:
- 截取文件名函数:
basename 绝对路径/test.txt :将返回test.txt
basename 绝对路径/test.txt .txt :将返回test
- 截取除文件名的绝对路径函数
dirname /home/a/test.txt :将返回 /home/a
自定义函数:
语法:
#!/bin/bash
function getSum() {
SUM=$[ $n1+$n2 ]
echo "和=$SUM"
}
#如果读取数字来获取
read -p "请输入数字n1=" n1
read -p "请输入数字n2=" n2
#调用
getSum $n1 $n2
综合案例:
- 备份数据库:
要求:每天2:30,将指定数据库备份到指定目录、备份开始和结束给出提示、备份文件以指定名称打包成.tar.gz形式(如:“2000-09-12_230201.tar.gz”)、备份时检查10天前备份的数据库文件,如果有删除
以root权限,到 /usr/sbin 目录下创建脚本:mysql_db_backup.sh
1 #!/bin/bash
2 #指定备份位置
3 BACKUP= /data/backup/db
4 #当前时间
5 DATETIME=$(data +%Y-%m-%d_%H%M%S)
6 echo $DATETIME
7
8 #数据库地址
9 HOST=localhost
10 #数据库用户名
11 DB_USER=root
12 #数据库秘密
13 DB_PW=qqq
14 #需备份的数据库名
15 DATABASE=aaa
16
17 #创建备份目录,如果不存在
18 [ ! -d "${BACKUP}/${database}" ] && mkdir -p "{$BACKUP}/{$databasei}"
19
20 #备份数据库
21 mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -r --database ${DATABASE} | gzip > ${BACKUP}/${database}/$DATATIME.sql.gz
22
23 #将文件处理成 tar.gz
24 cd ${BACKUP}
25 tar -zcvf $DATETIME.DATETIME.tar.gz ${DATETIME}
26
27 #删除对应的非压缩文件(备份文件)
28 rm -rf ${BACKUP}/${DATETIME}
29
30 #删除10天前备份文件
31 find ${BACKUP} -ATIME +10 -name "*tar.gz" -exec rm -rf {} \;
32
33 #显示备份信息
34 echo "备份数据库${DATABASE} 成功~"
任务调度:crontab -e
30 2 * * * /usr/sbin/mysql_db_backup.sh