Shell是一个命令解释器,它可以为用户提供一个向Linux内核发送请求以便运行程序的界面系统程序,用户可以通过Shell来启动、挂起、停止甚至是编写一些程序。
1. Shell编程快速入门
要求:
脚本以#!/bin/bash开头
脚本需要可执行权限
执行方式:
赋予xxx.sh脚本+x权限,执行脚本
chmod 755 xxx.sh
./xxx.sh
不用赋予+x权限,直接执行
sh ./xxx.sh
2. Shell变量
Shell变量主要分为系统变量和自定义变量
系统变量
$HOME、$PWD、$SHELL和$USER等
自定义变量
定义变量:变量=值(中间不能有空格)
撤销变量:unset 变量
定义静态变量:readonly 变量=值(静态变量不能unset)
把自定义变量升为系统变量,供其他脚本使用:
将命令的返回值赋值给变量:
1.A=‘ls -l’:运行里边的命令,并把结果返回给变量A(‘表示反引号,esc的下方那个键)
2.A=$(date):等价于反引号
3. 设置环境变量
expert 变量名=变量值:将shell变量输出为环境变量
source 配置文件:让修改后的配置信息立即生效
echo 变量名:查询环境变量的值
4. 位置参数变量
在执行shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
./myShell.sh 100 200:执行shell的命令,可以在myShell脚本中获取到参数信息100 200
$n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,10以上的参数需要用大括号包含,如${10}。
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,&@把每个参数区分对待
$#:这个变量代表命令行中所有参数的个数
bash:
输出:
5. 预定义变量
shell设计者预先定义好的变量,可以直接在shell中使用
$$:当前进程的进程号(PID)
$!:后台运行的最后一个进程的进程号(PID)
$?:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个指令已经执行;如果这个变量非0,则证明上一个命令执行不争取。
bash:
输出:
6. 运算符
基本语法:
$((运算式))或$[运算式]
expr m + n(expr运算符间要有空格)
运算符:
1.\*:乘
2./:除
3.%:取余
bash:
输出:
7. 条件判断
基本语法:
[ condition ](注意:condition前后要有空格)
非空返回true,可使用$?验证(0为true,>1位false)
[ atguigu ]:返回true
[]:返回false
常用判断条件
两个整数的比较
=:字符串比较
-lt:小于(less than:lt)
-le:小于等于(less equal:le)
-q:等于
-gt:大于(greater than:gt)
-ge:大于等于
-ne:不等于(not equal:ne)
按照文件权限进行判断
-r:有读的权限
-w:有写的权限
-x:有执行的权限
按照文件类型判断
-f:文件存在并且是一个常规文件
-e:文件存在
-d:文件存在并且是一个目录
bash:
输出:
8. 流程控制
if语句
if [ 条件判断 ];then
程序
fi
if [ 条件判断 ]
then
程序
elfi [ 条件判断 ]
then
程序
fi
编写一个shell程序,如果输入的参数大于等于60,则输出“及格了”,如果小于60,则输出“不及格”。
case语句
基本语法:
case $变量名 in
"值1")
如果变量值等于1,则执行程序1
;;
"值2")
如果变量值等于2,则执行程序2
;;
"值3")
如果变量值等于3,则执行程序3
;;
esac
当命令行参数是1时,输出“周一”;是2时,输出“周二”;其它情况输出“other”。
for循环
for 变量 in 值1 值2...
do
程序
done
for ((初始值; 循环控制条件; 变量变化))
do
程序
done
使用第一种方式打印命令行的输入参数
使用第二种方式将1加到100的值输出显示
while循环
while [ 条件判断 ]
do
程序
done
从命令行输入一个数,统计从1+...+n的值是多少?
9. read读取控制台输入
基本语法:
read [选项] 参数
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,则不再等待了。
变量:指定读取的变量名
读取控制台输入的number
10. 函数
shell里有系统函数和自定义函数
系统函数
basename [pathname] [suffix]
删掉所有的前缀包括最后一个/字符,然后将字符串显示出来
suffix为后缀,如果suffix被制定了,basename会将pathname或string中的suffix去掉。
dirname [pathanme]
返回完整路径最后/的前面部分,常用于返回路径部分
自定义函数
[ function ] funname[()]
{
程序;
[return int;]
}
调用直接写函数名:funname [值]
计算两个数的和
11. Shell编程实例
需求:
每天凌晨2:10备份数据库atguiguDB到/data/backup/db
备份开始和备份结束给出相应的提示信息
备份后的文件要求以备份时间命名,并打包成.tar.gz
在备份时,检查是否有10天前的备份,如果有就删除
编写crontab执行脚本:
crontab -e
10 2 * * * /usr/sbin/mysql_backup_db.sh