Shell编程
Shell是一个命令行解释器 ,它为用户提供了向Linux内核发送请求以便运行程序的界面系统级故障
第一个Shell入门程序
(1)vim编写一个hello.shell文件
脚本都是以#!/bin/bash为开头的
(2)脚本的常用两种执行方式
- 需要赋予脚本+x执行权限
./文件名.sh
绝对路径
- 不需要权限
sh 文件名.sh
Shell 变量
系统变量,自定义变量
查看所有的系统变量set
自定义变量
定义变量
定义变量的规则:
(1)变量名称可以由字母,数字下划线组成,但是不能以数字开头
(2)等号两侧不能有空格
(3)变量名称一般习惯为大写
基本语法变量名=值
#!/bin/bash
a=1100
echo $a
echo "$a"
echo a=$a
echo "a=$a"
撤销变量
基本语法 unset 变量名
unset a
echo a=$a
声明静态变量
基本语法 readonly 变量
注意:不能unset
readonly B=100
echo "B=$B"
unset B
将命令的返回值赋给变量
1. A=`date`反引号,运行里面的命令,并把结果返回给变量A
2. A=$(date) 与上面等价
A=`date`
B=$(date)
echo A=$A
echo B=$B
设置环境变量
基本语法:
(1)export 变量名=变量值 将shell变量输出为环境变量/全局变量
(2)source配置文件 让修改后的配置信息立即生效
(3)echo $变量名 查询环境变量的值
例如:
设置Tomcat的环境变量
使其生效 source /etc/profile
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用位置参数变量
基本语法:
$n (功能描述: n为数字,$0代表命令本身,$1-$9 代表第- -到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如$({10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成-一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)
!/bin/bash
echo 0=$0 1=$2 2=$2
echo "所有的参数=$*"
echo "$@"
echo "参数的个数=$#"
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$ ( 功能描述:当前进程的进程号(PID) )
$! (功能描述: 后台运行的最后一个进程的进程号(PID) )
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上-个命令正确执行;如果这个变量的值为非0 (具体是哪个数,由命令自已来决定),则证明上一个命令执行不正确了。)
#!/bin/bash
echo "当前执行的进程id=$$"
#以后台的方式运行一个脚本,并获取他的进程号
sh hello.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"
运算符
基本语法:
$((运算式)) 或者$[运算式] 或者 expr m + n expr运算符间要有空格
如果把expr的结果赋给某个变量,使用``反引号
expr m -n
expr \*乘 /除 %取余
计算(2+3)*4的值
RES1=$(((2+3)*4))
echo 第一种方法=$RES1
RES2=$[(2+3)*4]
echo 第二种方法=$RES2
RES3=`expr 2 + 3`
RES4=`expr $RES3 \* 4`
echo 第三种方法=$RES4
条件判断
判断语句
基本语法:
[ condition ] 注意:condition 前后要有空格
[ ] 空返回false
[ liuheng ] 非空返回true
常用的判断条件:
(1)=字符串比较
(2)两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
(3)按照文件权限进行判断
-r 读的权限
-w 写的权限
-x 执行的权限
(4)按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
if判断
#单判断语句
if [ "ok" = "ok" ]
then
echo "equal"
fi
# 判断目录中的文件是否存在
if [ -f /root/shcode/hello.sh ]
then
echo "文件存在"
fi
#多分枝判断
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case语句
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac
for循环
#!/bin/bash
#$*是把输入的参数,当作一个整体
for i in "$*"
do
echo "num=$i"
done
# $@ 分别对待
for i in "$@"
do
echo "num=$i"
done
对统计1+2+…+100的值
#!/bin/bash
SUM=0
for((i=0;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "从1加到100的值输出=$SUM"
while循环
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+ 1]
done
echo "执行的结果:=$SUM"
read 读取控制台输入
基本语法:read(选项)(参数)
-P:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
#!/bin/bash
#案例1:读取控制台输入一个NUM1值
read -p "请输入-个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"
#案例2:读取控制台输入一个NUM2值,在10秒内输入。
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"
函数
系统函数
这里只介绍两个常用的
(1)获取文件名basename
(2)返回路径 dirname
自定义函数
基本语法:
[ function ] funname[()]
{
Action
[return int;]
}
调用直接写函数名 funname [值]
#!/bin/bash
function sum(){
GSUM=$[$n1+$n2]
echo "和是:$GSUM"
}
read -p "请输入第一个数n1=" n1
read -p "请输入第二个数n2=" n2
sum $n1 $n2
数据库备份实例
- 设置备份文件的储存目录,数据库名,地址,密码
- 备份数据库
- 打包成以备份时间为文件名的.tar.gz文件
- 删除10天前备份的数据库文件
- 控制台显示备份成功
#备份目录
BACKUP=/data/backup/db
#当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库的地址
HOST=localhost
#数据库用户名
DB_ USER=root
#数据库密码
DB_ PW=123456
#备份的数据库名
DATABASE=数据库名
#创建备份目录,如果不存在,就创建
[!-d "${BACKUP}/${DATETIME}" ] && mkdir -p "${ BACKUP}/${DATETIME}"
#备份数据库
mysqldump -u${DB_ USER} -p${DB_ PW} -host=${HOST} -q -R --databases ${DATABASE} | gzip > ${ BACKUP}/${DATETIME }/$DATETIME sql.gz
#將文件处理成tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar. gz ${DATETIME}
#删除对应的备份目录
rm -f ${BACKUP}/${DATETIME}
#删除10天前的备份文件
find ${BACKUP} -atime + 10 -name "*.tar.gz" -exec rm-rf{} \;
echo "备份数据库${DATABASE}成功~"