一、脚本概述与要求
1、脚本原理
脚本的意义:通过命令解析行的方式帮我们自动取执行设定好的命令代码;
脚本里的命令是一行一行的执行内容里的命令;脚本里写的命令必须都是“非交互式命令”。
假如我们把脚本挂在定时任务里,那就是自动在某个没有人的时间里,自动触发程序。
2、书写脚本格式要求
后缀必须以.sh结尾
内容第一行必须以#!/bin/bash
3、脚本的开启要求
用sh命令或者bash命令开启
在Linux下,绝对路径执行脚本,不告诉它用什么解释器,会默认用bash解释器,
以绝对路径,直接执行脚本(脚本文件必须有x权限)
chmod +x benchi.sh
4、脚本的逻辑性判断
(1)判断命令:
-f +文件名 判断是否是文件(是否存在) echo$
-d +目录 判断对象是否是目录(是否存在) echo$
-d 判断目标是否存在(无论是文件或目录)
-z 判断某个字符串是否为空
eg:[ -z “” ] && echo 空 || echo “不空”
判断完后,输入echo$ 输出0即判断正确,非0则错误,或者不存在
eg:
test -d /root/asdf && cd /root/asdf && pwd || echo ”不去了”
执行前面的test -d /root/asdf,如果失败则不执行&&后面的命令;
eg:[-d /root ] || mkdir -p /root
cd /root
判断/root是否是目录,是否存在;如果存在则不执行||后面的命令
直接执行下一行;
如果不存在,则执行||后面的命令,然后再执行下面的命令。
(2)[ ]真假判断条件
xx=”welcome”
[ $xx == “welcome” ] && echo “0” || echo “1”
两个等号就是等于, !=不等于
[] -a 并且,两端都为真
[] -o 或,有一个为真
[] ! 相反则为真
(3)大于与小于判断
-gt命令:(great than)大于 -ge命令:大于等于
-lt 命令:(less than) 小于 -le 命令:小于等于
-eq命令:等于 -ne 命令:不等于
(4)关于逻辑&& ||
&&符号的左边执行正确(0),则执行右边,否则不执行
|| 符号的左边执行错误(非0),则执行右边,否则不执行
||前面的命令执行失败,则执行||后面的命令。
eg:真假 && cd /root || cd /home
(5)看变量字符的数量${#x}
(6)sh -x 跟踪判断,每一条输出和命令都能看到执行的过程,用来判断哪一条代码出错。
二、交互式脚本
1、让用户输入变量
read + 变量
read num (num是变量)
echo $num ($num就是输出上面的变量)
这时候输入111
输出的就是111
2、用户提示语参数
(1)read -p 提示语参数-p
read -p ”文本提示“ 变量(变量首字母大写)
eg:
#!/bin/bash
read -p “请输入数字:” num
echo $num
(2)read -p具体应用
read -p “请输入你的成绩:” num
[ $num -lt 60 ] && echo “不及格”
[ $num -eq 60 ] && echo”及格”
[ $num -gt 60 -a $num -lt 70 ] && echo “良”
[ $num -ge 70 -a $num -lt 80 ] && echo”良好”
[ $num -ge 85 -a $num -le 100 ] && echo “优秀”
[ $num -ge 100 ] && echo “sb”
User=“baoma”
Passwd=“123123”
read -p “请输入账号:” user
read -p “请输入密码” passwd
[ $User == $user ] && echo “账号正确” || echo “账号错误”
[ $Passwd == $passwd ] && echo “密码正确” || echo “密码错误”
(3)通过参数的方式进行交互
例如:/etc/init.d/postfix start;/etc/init.d/目录下的文件都是脚本,但是却可以通过加start启动脚本,这就是参数传递。
$# 表示参数的个数
$* 横向显示所有参数 ($*将命令行的所有参数看成一个整体)
$@ 横向显示所有参数 ($@则区分各个参数)
$0 代表脚本文件的执行路径
$1...$n 对应传入不同的参数
(4)模拟C语言计算
#!/bin/bash
a=1
b=2
echo “$((a+b))”
用两个小括号模拟C语言运行
(5)输入重定向
cat << FOF (FOF是结束符号,碰到这个符号就截止)
输入命令后,开始换行输入内容,最后把结果传给cat,输出到屏幕上。
cat > BENCHI.txt << FOF
输入命令后,开始换行输入内容,最后把结果传给cat,cat再重定向到文件里。
3、反引号``
xx=`which cp`
echo $xx
反引号里命令的执行结果赋值到xx上,然后输出到屏幕上
4、强行终止脚本 exit
exit (碰到这个字样就强行终止)
[ $# -eq 3 ] && echo “你输入了3个参数”&& exit
echo “你输入的参数不对”
##如果输入的参数个数等于3个,则输出“你输入了3个参数”然后退出
如果输入的参数个数不符合条件,则输出第二行“你输入的参数不对”
三、逻辑语法
1、if语句(单条件)
if [条件] 如果
elif[条件] 否则如果
then 就
else 否则
fi 结尾符号
eg:
read -p “请输入一个数字:”num
if [ $num -eq 66 ]
then
echo “正确”
else
echo “错误”
fi
##请输入一个数字,如果输入66,则显示正确,如果输入非66,则显示错误。
2、if语句多条件
执行顺序是从上到到下优先级,执行完成后,后面不执行。
read -p “请输入你的成绩:” num
if [ num -ge 100 ] 如果:
then 则:
echo “牛逼”
elif [ num -ge 85 ] 否则如果:
then 则:
echo “优秀”
elif [ num -ge 70 ] 否则如果
then 则
echo “优秀”
elif [ num -ge 60 ] 否则如果
then 则
echo “及格”
else 否则
echo“不及格” 就
fi 结束
四、搭建yum仓库
五、for循环语法
1、for循环概述
for i in 13579
do
echo $i
done
原理:i在13579里一个一个得取值,先把1赋值给i,然后i把1带入循环体中,(循环体就是do和done之间)进行这之间的输出到done结束,再返回赋值下一个,再带进循环体....直到都取完输入完。
2、for循环后面可以跟一个命令
for循环后面可以跟一个命令,但是要加反引号,而且需要横排的命令
eg:for i in `ls /root | xargs`
3、for变种C语言循环(())
for((i=0;i<10;i=i+1))
解析:先给i设定一个初始值i=0;然后设定一个循环条件i<10;如果到不符合这个条件就结束循环,再设定一个条件递增公式i=i+1,再进入循环条件里判断,最后再执行
4、判断网段里IP地址哪些存活
for ((ip=1;ip<255,ip++))
do
ping -c 1 192.168.154.$ip &>/dev/null
if [ $? -eq 0 ];then
echo”192.168.154.$ip活的”
fi
done
ping -c 1:ping一次结束,不再ping
ping -i 0.1:以0.1秒的速度ping
六、其他循环体
1、while循环概述
read -p “输入:” i
while [ $i -lt 10 ]
do
echo $i
let i++
done
无限循环,后面加一个冒号,什么都不用加了,进入无限循环
while :
2、break
碰到break跳出当前的循环,执行循环下面的内容...
3、continue
终止当前的本次循环,回到当前循环开头再走一遍。
4、return
碰到return直接跳出函数体,执行函数体后面的内容...
七、case
1、case的基础用法:
一般用在没有优先级的场合,每种条件的情况看起来非常简单;都是平级的,没有优先级关系,通常启动脚本的时候,只用这种格式。
2、模仿系统脚本详细用法的步骤
(1)首先要引用一个函数库,这样就可以用action命令(有系统脚本的效果)
(2). 是在当前位置下引用函数,
(3)$1 代表脚本外的变量,如:start、stop等
(4)要想脚本外专业的显示开启或关闭(ok、fail的字样)就要这样写。
3、让chkconfig识别自己写的脚本
在脚本的开头加# chkconfig: 35 90 10
35代表在35模式中启动,90关机的优先级和10开机的优先级(后面两个数字不用记)
使用命令:chkconfig --add case.sh
chkconfig --list cash 查看该服务开机自启动状态
八、函数式编程
1、函数的概述
把一些小过程,写到函数里,当我们需要用到这些小过程的时候,只要调用函数名字,即可实现。
无论什么编程语言,基本只有三种编程方法
1、面向过程:
就是按照一定的顺序进行代码的编写,不能跳步。
2、面向对象
3、函数式编程
这三种模式,并不是语法,而是教我们如何取编写代码的方法论。
在shell这种语言里,只能支持面向过程这种编程方法。
2、函数的写法格式
function 是函数体里必须要有的
xicai是这个函数的名字
(){}是必须要有的格式
最后调用的时候,需要在调用的位置写出函数的名字。
3、函数的源码编译应用