一,shell脚本的必须要素
1,脚本名字需要以.sh结尾命名
2,脚本里的第一行必须写#!/bin/bash 原因:以下命令是以bash解析器解析代码
脚本统一存放的路径
[root@zhuxinwang /]# mkdir -p /sercer/scripts
[root@zhuxinwang /]# cd /sercer/scripts
二:执行脚本的俩种方法
1,sh或bash 命令激活脚本
2,给脚本可执行权限x,然后以脚本的绝对路径方式执行
三,写脚本的注意事项
1,脚本的命令是死的,不会向人一样通过眼睛判断是否可执行,英雌,我们需要对脚本的命令进行是否可行的逻辑判断,判断后在进行命令的执行。
(1)通过test -d(f) 来判断是目录还是文件
(2)通过中括号[]来判断目标是否目录还是文件还能进行字符串判断以及数字大小的比对。
==[-d /root/bent ] 判断是否为目录
[ -f /root/bent/yunjisuan.sh ] 判断是否为文件
[ $变量 ===“字符串” ] 进行字符串 是否相等判断
[ $0变量 -gt(lt,le,ge,eq)数字 ] 进行数字大小判断
[ -e /root/bent/yunjisuan.sh ] 判断是否存在目录或者文件
[ -z /root/bent/yunjisuan.sh ] 判断字符串是否为空
gt (great than) 大于
eq 等于
lt(less than) 小于
ge 大于等于
le 小于等于
结论:以上判断均可通过$?进行成功与否的取值,0代表判断为真,非0代表判断为假(3)关于逻辑与&& 逻辑或 ||
&&符号的左边为真(0),方可执行右边,否则右边不执行
||符号的左边为假(非0),方可执行右边,否则右边不执行
注意 : 逻辑与可以多次用,但是逻辑或只能用一次,通常用在最后面
四,关于脚本的交互式输出模式
1,我们可以通过read命令进行交互式输入
例如: read变量 或者read -P “”“文本提示” 变量
2,通过参数传递的方式进行交互
$#代表参数的个数
$*横向罗列参数
$#横向罗列参数(有着细微的变化)
$0文件执行的绝对路径
1
。
。
1。。
1。。n对应传入不同的参数
注意
我们在敲命令做事的时候,我们可以用眼睛看,如果眼睛看到就出来问题,自然我们就不会继续操作了。但是,脚本这东西是自动的。他是不会主动判断的,因此我们需要让脚本来根据我们设定的代码进行判断。
3,yum 仓库 安装 逻辑走向
#!/bin/bash
umount /dev/sr0
[ -d /media/cdrom ] || mkdir -p /media/cdrom
mount /dev/sr0 /media/cdrom
if [ $? -ne 0 ];then
echo "请查看磁盘是否插入"
exit
fi
[ -d/etc/yum.repos.d ] || mkdir -p/etc/yum.repos.d
cd /etc/yum.repos.d
mv * /tmp/
cat > /etc/yum.repos.d/local.repo << FOF #这里是输入重定向,类似于把内容然后以FOF结尾输入到了/etc/yum.repos.d/local/repo
[zxw]
name=zxw
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
FOF
yum -y chean all && echo "清空缓存"
yum makecache && echo "生成缓存"
4,if 单条件语句或多条件语句(必须加elif)
if [ 条件 ];
如果条件1是真那么,就执行动作1,否则就执行动作2
#! /bin/bash
x=10
if [ $x -ne 10 ];then
echo "真的"
else
echo "假的"
fi
如果条件1成立也就是真;那么,就执行动作1,否则,就执行动作2
if ,then,elif,else,fi
通过这种语句,来控制脚本的走向。
交互式输出模式案例
例如: read变量 或者read -P “”“文本提示” 变量
输入的结果
#!/bin/bash
read -p "请输入你的考试成绩:" zxw
if [ $zxw -gt 100 ];then
echo "你是智障吗"
elif [ $zxw -ge 85 ];then
echo "优秀"
elif [ $zxw -ge 70 ];then
echo "优良"
elif [ $zxw -ge 60 ];then
echo "及格"
else
echo "我错了别打我- -"
fi
输出的结果
[root@zhuxinwang benet]# sh test.sh
请输入你的考试成绩:101
你是智障吗
[root@zhuxinwang benet]# sh test.sh
请输入你的考试成绩:90
优秀
[root@zhuxinwang benet]# sh test.sh
请输入你的考试成绩:72
优良
[root@zhuxinwang benet]# sh test.sh
请输入你的考试成绩:61
及格
[root@zhuxinwang benet]# sh test.sh
请输入你的考试成绩:11
我错了别打我- -
for复循环语句
首先变量i 用i这个变量 in 后边这个范围 ,要在五个数取值 ,先会从1这个值取 ,先让i=1 ,由1赋值给i ,把这个变量值导入循环体 就是do 和 done之间的部分,以此类推
[root@zhuxinwang benet]# sh zxw.sh
1
3
5
7
9
[root@zhuxinwang benet]# cat zxw.sh
#!/bin/bash
for i in 1 3 5 7 9
do
echo $i
done
[root@zhuxinwang benet]#
用C语言写无限循环
#!/bin/bash
for ((i=0;;i++))
do
echo $i
done
#!/bin/bash
h=0
for i in {1..10}
do
echo $h
((h++))
或者 let h++
done
查看这个网段里面有哪些ip地址是存活的
没有用的扔到黑洞里
#!/bin/bash
for ip in 192.168.233.{1..254}
do
ping -c 1 $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip活的"
fi
done
while无限循环
无限循环与c语言的复循环一样
这是永真的写法(没有假)
read -p "输入:" i
while :
do
echo $i
let i++
done
case函数
if必定有优先级
使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量不同取值,执行不同的命令序列。
case通常没有优先级关系(开关没有优先级)
一般做启动脚本的时候通常用着种语句
#!/bin/bash
# chkconfig: 35 90 10 #要想让chkconfig在里面启动的话需要在配置文件中,加入一些代码
. /etc/init.d/functions #引入函数库(不用管啥叫函数库)
case $1 in
start)
action "服务开始启动.." /bin/true
;;
stop)
action "服务准备停止.."/bin/false
;;
restart)
action "服务准备停止" /bin/false
action "服务准备启动" /bin/true
;;
*)
echo "请输入正确参数"
;;
esac
chkconfig --add test.sh
chkconfig --list test.sh 管理自己的脚本服务开启模式
函数
函数的作用:当我们需要用到这些小过程的时候只要调用函数的名字即可
不论什么编程语言,基本只有三种编程方法
1面向过程
2面向对象
3函数式编程
这三种方法,并不是语法,而是教我们如何去编写代码的方法论
在shell语言里,只能支持面向过程这种编程方法。
什么是面向过程
1,刷锅
2,买菜
3,洗碗
4,开火
5做饭
6洗菜
7,炒菜
8 吃
这个是过程
过程是按照一定顺序进行代码的编写,不能跳步,这个就是过程。
#! /bin/bash
function zxw(){
echo "摘抄"
echo "洗个锤子"
echo "我不洗了"
}
zxw
zxw
zxw
zxw
zxw
zxw
zxw
break continue exit return 四种循环控制语句
exit 强制终止
break 跳出离他最近循环体
continue 条件为真;终止当前本次循环,直接进入下次循环
return 针对函数,直接跳出函数体
练习题
用户登录验证程序
1,脚本里设置俩个用户名和密码
2,让用户从屏幕输入账户和密码进行登录
3,如果账户输入错误,让他继续输入账户
4,账户正确,输入密码
5,密码正确,登录成功
6,同一个账号,密码最多允许输错3次,3次都输错,账号锁定。(此时脚本不能退出)
7,锁定账号以后,让他继续可以登录未锁定账号
#!/bin/bash
function login(){
user1="zxw1"
passwd1=123
user2="zxw2"
passwd2=456
file=/tmp/haha.txt
read -p "请输入用户:" a
while [ "$a" != "$user1" ] && [ "$a" != "$user2" ]
do
echo "您输入的用户是错误的!!"
read -p "请输入用户:" a
#不是user1就是user2
done
read -p "请输入你的密码:" b
if [ $a == $user1 ];then
passwd=$passwd1
else
passwd=$passwd2
fi
for i in 1 2 3
do
if [ $b != $passwd ];then
if [ $i -ge 3 ];then
echo "您的账号被锁定"
break
else
echo "密码错误"
read -p "请输入您的密码" b
fi
else
echo "登录成功"
fi
done
if [ $a == $user1 ];then
x=$user2
else
x=$user1
fi
read -p "请输入其他用户:" c
while [ "$c" != "$x" ]
do
if [ $c == $a ];then
echo "我被锁了"
read -p "请重新输入你的用户:" c
else
echo "输入用户错误"
read -p "请输入其他用户" c
fi
done
read -p "请输入你的密码:" d
if [ $c == $user1 ];then
passwd=$user1
else
passwd=$user2
fi
for i in 1 2 3
do
if [ $d != $passwd ];then
if [ $i -ge 3 ];then
echo "对不起,所有用户都锁了"
exit
else
echo "密码错误"
read -p "请输入你的密码" d
fi
else
echo "$c 登陆成功"
fi
done
}
function title(){
cat << FOF
*********************************
1,login
2, exit
*********************************
FOF
}
while :
do
clear
title
read -p "请输入你的选择:" num
case $num in
1)
login
;;
2)
echo "exit"
sleep 2
;;
esac
done