1)shell脚本的作用
自动化运维使用
批量化重复操作使用脚本代替
2)shell解释器的作用
Linux系统默认使用的bash命令解释器
负责接收用户输入的命令提交CPU判断执行
1)脚本的结构
[root@centos01 ~]# vim test.sh |
脚本后缀文件*.sh |
#!/bin/bash |
声明 |
#E-mail:[email protected] |
脚本的描述和写脚本的联系方式 |
脚本执行的命令 |
2)运行脚本的方式
[root@centos01 ~]# sh test.sh |
使用sh命令运行 |
[root@centos01 ~]# ./test.sh |
在当前位置运行脚本 |
[root@centos01 ~]# source ./test.sh |
source命令运行脚本 |
1)基本的输入输出
标准的输入:接收或者读取用户输入的数据<
标准的输出:将数据显示在屏幕或者文件中>,追加>>
错误输出:错误输出可以显示在屏幕或者特定文件中,2>错误输出
混合输出:不管是正确或者错误都输出到文件中,&>
2)管道符|
把前一个命令执行的结果,变成后一个命令处理的对象
1)自定义变量
管理员手动创建,根据需要自己定义
2)环境变量
维护系统使用
不需要管理员创建系统自动创建
3)位置变量
命令行给脚本传递程序参数使用
4)预定义变量
bash预定义好的特殊变量
用户不能修改
1)创建变量,变量名字是a变量值为10
[root@centos01 ~]# a=10
2)查看变量值两种方法
[root@centos01 ~]# echo $a
[root@centos01 ~]# expr $a
1)双引号,允许通过$符号引用其他变量值
[root@centos01 ~]# test="$ab $bb"
[root@centos01 ~]# echo $test
benet 6.0
2)单引号,禁止引其他变量值
[root@centos01 ~]# test='$ab $bb'
[root@centos01 ~]# echo $test
$ab $bb
3)反撇,命令替换提取命令执行的结果
[root@centos01 ~]# aa=`netstat -anptu | grep 22`
[root@centos01 ~]# echo $aa
4)read将输入的内容赋值给特定的变量名
[root@centos01 ~]# read -p "请输入特定的目录:" insert
请输入特定的目录:/boot
[root@centos01 ~]# echo $insert
/boot
5)定义全局环境变量子shell可以应用
[root@centos01 ~]# export a=100
[root@centos01 ~]# echo $a
1)创建的运算符
+:加法
-:减法
\*:乘法
/:除法
%:求模(余)运算
2)运算基本的应用
[root@centos01 ~]# a=100
[root@centos01 ~]# b=200
[root@centos01 ~]# expr $a + $b
300
[root@centos01 ~]#expr 1 + 1
[root@centos01 ~]#echo $[1+1]
[root@centos01 ~]#echo “scale=2;1.25*1.25”|bc
[root@centos01 ~]#free
[root@centos01 ~]#vim mom.sh
#!/bin/bash
mt=$(free | awk 'NR==2{print $2}')
mu=$(free | awk 'NR==2{print $3}')
muu=$(expr $mu \* 100 / $mt)
echo $muu
或者
echo "scale=2; $mu/$mt*100" |bc
[root@centos ~]# free | awk 'NR==2{print int($3/$2*100)"%"}'
3)花括号的用于区分符号
[root@centos01 ~]# echo ${ab}0.10.1
benet0.10.1
1)环境变量
系统创建
2)位置变量
提供9个位置$n(n代表1--9)
3)预定义变量
$#:命令行中位置参数
$*:所有位置参数
$?:记录的脚本执行状态0表示成功,非0表示错误
$0:执行脚本的进程程序名字
[root@centos ~]# vim bak.sh
#!/bin/bash
mkdir /backup
tar zcf /backup/file_all-$(date +%F).tar.gz $* &>/dev/null
echo "共备份了$#个文件"
echo "成功执行了$0脚本"
echo "备份的文件为:$*"
或者
[ $? -eq 0] && echo "成功执行了$0脚本"
[root@centos ~]# chmod +x bak.sh
[root@centos ~]# ./bak.sh /etc/passwd /etc/group
清除重建缓存
yum clean all && yum makecache fast
挂载光盘
#!/bin/bash
#用户自动构建yum仓库脚本
#挂载光盘
mount /dev/cdrom /mnt
#创建仓库文件
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak
#创建yum文件
echo “[yum]
name=yum
baseurl=file:///mnt
enabled=1
gpgcheck=0” > local.repo
# 清除重建缓存
yum clean all && yum makecache fast
批量处理统一文件内容---非交互
vi pass.txt
123456
#useradd user1
#passwd --stdin user1 < pass.txt
或者
#echo “123456” | passwd --stdin user1
&> 或者2>&1, &>有些语法不支持
vim /etc/init.d/network
挂载光盘提示信息重定向到黑洞
#!/bin/bash
#用户自动构建yum仓库脚本
echo “挂载光盘…..”
mount /dev/cdrom /mnt &> /dev/null
echo “创建仓库文件…..”
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak
#创建yun文件
echo “[yum]
name=yum
baseurl=file:///mnt
enabled=1
gpgcheck=0” > local.repo
echo “清除重建缓存…..”
yum clean all &> /dev/null && yum makecache fast &> /dev/null
echo “yum创建成功….”
#cd /boot | ls –l
#cd /boot ; ls –l
#ls /etc | wc -l
#find ./ -name “*.sh”| xargs ls -l xargs强制接收
#cat 123
11 22 33
aa bb cc
#awk ‘{print $2}’first.sh
#awk ‘ {print $2}’123
#awk ‘{print $2,$1,$3}’123
#df
#df |grep “/$”| awk ‘{print $5}’
#df |grep “/$”| awk ‘{print $5}’| awk –F ‘%’ ’{print $1}’
或者
# df | awk –F’[ %]+’ ’/\/$/{print $(NF-1)}’
#x=18
#expr 3 + $x
变量
#!/bin/bash
#用户自动构建yum仓库脚本
x=”/mnt”
echo “挂载光盘…..”
mount /dev/cdrom $x &> /dev/null
echo “创建仓库文件…..”
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak
#创建yun文件
echo “[yum]
name=yum
baseurl=file://$x
enabled=1
gpgcheck=0” > local.repo
echo “清除重建缓存…..”
yum clean all &> /dev/null && yum makecache fast &> /dev/null
echo “yum创建成功….”
rpm –qi $(rpm –qf $(which mkdir))
变量输出
#name=zhangsan
#echo $name
#echo ${name}
#echo $namenihao
#echo ${name}nihao
read -p “请输入你的名字:” name
echo $name
变量
#!/bin/bash
#用户自动构建yum仓库脚本
read -p “输入你的挂载点位置:” x
echo “挂载光盘…..”
mkdir $x
mount /dev/cdrom $x &> /dev/null
echo “创建仓库文件…..”
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak
#创建yun文件
echo “[yum]
name=yum
baseurl=file://$x
enabled=1
gpgcheck=0” > local.repo
echo “清除重建缓存…..”
yum clean all &> /dev/null && yum makecache fast &> /dev/null
echo “yum创建成功….”
交互界面
#!/bin/bash
echo “centos….
kernel….”
read –p “localhost login:”user
if [ $user = “root”]
then
echo “欢迎登陆”
else
echo “拜拜”
fi
1)判断结果类型
真
假
2)判断语法
[root@centos01 ~]# test -d /boot && echo "YES" |
测试boot是目录显示YES |
[root@centos01 ~]# [ -d /boot ] && echo "yes" |
测试boot是目录显示YES |
3)常见的测试选项
-d测试目录
-f测试文件
-w测试写权限
-r测试读权限
-x测试执行权限
-e测试文件目录是否存在
[root@centos ~]# vim cd.sh
#!/bin/bash
[ -d /cd ] || mkdir /cd
[ -d /cd/Packages ] || mount /dev/cdrom /cd &> /dev/null
1)常见的比较运算符
gt大于
lt小于
ge大于等于
le小于等于
eq等于
ne不等于
[root@centos ~]# vim num.sh
#!/bin/bash
read -p "请输入一个数字:" num
[ $(expr $num % 2) -eq 0 ] && echo "$num 是偶数" || echo "$num 是基数"
[root@centos ~]# sh num.sh
请输入一个数字:123
123 是基数
2)比较运算符的基本使用
[root@centos01 ~]# [ 10 -gt 5 ] && echo "YES" |
10大于5显示为yes |
[root@centos01 ~]# abc=`history | wc -l` [root@centos01 ~]# [ $abc -gt 100 ] && echo "yes" |
提取history命令行数,和100比较大于100显示yes |
1)字符串比较运算符
=:字符串内容是否相同
!=:字符串内容是否不同
-z:检查字符串是否为空
2)字符串比较的应用,字符串需要使用双引号
[root@centos01 ~]# [ "aaa" = "aaa" ] && echo "yes" |
判断aaa字符全是否等于aaa字符 |
[root@centos01 ~]# [ $LANG != "en.US" ] && echo "不支持中文!!" |
LANG变量不等于en.US显示不支持中文 |
1)逻辑测试的常见运算符
&&:而且或者用-a表示,两个结果为真显示
||:或,或者使用-o表示,两个判断结果只需要满足一个条件显示为真
!:否,两个判断结果不成立为真
[root@centos ~]# vim cj.sh
#!/bin/bash
read -p "输入考试成绩:" num
[ $num -ge 60 -a $num -le 100 ] && echo "考试及格"
或者
[ $num -ge 60 ] && [ $num -le 100 ] && echo "考试及格"
2)逻辑测试简单使用
[root@centos01 ~]# [ -d /etc ] && [ -d /boot ] && echo "是目录!!" |
两个结果为真显示是目录 |
[root@centos01 ~]# [ -d /etc ] || [ -d /ssss ] && echo "是目录!!" |
两个结果一个为真显示为是目录 |
1)单分支
条件满足执行命令序列
2)双分支
条件满足执行第一个命令序列
条件不满足执行第二个命令序列
3)多分支
条件满足执行第一个命令序列
条件不满足第一个条件匹配第二个条件,执行第二个命令序列
不满足第二个条件执行最后一个条件运行默认命令序列
1)单分if判断命令结构
if [ 条件 ]
Then
执行命令序列
fi
2)测试目录是否存在,不存在自动创建,目录存在停止执行脚本
#!/bin/bash
mount="/mnt/test"
if [ ! -d $mount ]
then
mkdir -p $mount
Fi
3)测试磁盘空间
[root@centos01 ~]# export aa=`df -Th | grep "/$" | awk '{print $5}' |awk –F “%” ‘{pring $1}’` |
提取磁盘空间 |
[root@centos01 ~]# cat fdisk.sh #!/bin/bash if [ $aa -eq 73 ] then echo "磁盘已经沾满不能存储数据!!!" fi [root@centos01 ~]# |
提取磁盘空间等于73G提醒用户不能存储数据 |
[root@centos ~]# vim disk.sh
#!/bin/bash
du=$(df | grep "/$" | awk '{print $5}' | awk -F'%' '{print $1}')
if [ $du -gt 3 ]
then
echo "使用超出"
fi
1)多分支的命令结构
if [ 条件 ]
then
执行命令序列一
else
执行命令序列二
Fi
1、httpd服务是否启动
[root@centos ~]# vim httpd.sh
#!/bin/bash
netstat -lnpt | grep -q :80
if [ $? -eq 0 ]
then
echo "网站服务正在运行"
else
echo "服务关闭,尝试启动"
systemctl start httpd
fi
[root@centos ~]# bash httpd.sh
2、判断bind的包是否安装
[root@centos ~]# vim bind.sh
#!/bin/bash
rpm -q bind &> /dev/null
if [ $? -eq 0 ]
then
echo "软件包已安装"
else
echo "软件包未安装,尝试安装"
yum -y install bind &> /dev/null
[ $? -eq 0 ] && echo "软件安装成功"
fi
[root@centos ~]# bash bind.sh
2)判断的主机是否通信
[root@centos01 ~]# cat ./ping.sh
#!/bin/bash
read -p "请输入指定的IP地址:" ping
ping -c 3 -i 0.2 -W 3 $ping &> /dev/null
if [ $? -eq 0 ]
then
echo "host is $ping UP!!!!"
else
echo "host is $ping DOWN!!!!"
fi
或者
[root@centos ~]# vim ping.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is up"
else
echo "host $1 is down"
fi
[root@centos ~]# chmod +x ping.sh
[root@centos ~]# ./ping.sh
[root@centos ~]# ./ping.sh 192.168.200.1
1)多分支if判断语法结构
if [条件判断]
then
执行命令序列一
elif [ 条件判断 ]
then
执行命令序列二
else
执行命令序列三
2)编写多分支测试脚本
判断成绩是否合格正常语句—---有漏洞
#!/bin/bash
read -p "输入考试成绩范围1~100分:" test
if [ $test -ge 85 ] && [ $test -le 100 ]
then
echo "$test 分,你真棒考试优秀!!!"
elif [ $test -ge 70 ] && [ $test -le 84 ]
then
echo "$test 分,考试合格需要继续努力!!!"
else
echo "$test 分,你需要重新学习!!!"
fi
或者
#!/bin/bash
read -p "输入考试成绩范围1~100分:" test
if [ $test -ge 0 -a $test -le 100 ]
then
if [ $test -ge 85 -a $test -le 100 ]
then
echo "$test 分,你真棒考试优秀!!!"
elif [ $test -ge 70 -a $test -le 84 ]
then
echo "$test 分,考试合格需要继续努力!!!"
else
echo "$test 分,你需要重新学习!!!"
fi
else
echo "成绩有误,无法判断"
fi
石头剪刀布
[root@centos ~]# vim games.sh
#!/bin/bash
echo "这是(石头0 剪刀1 布2)的小游戏,放松一下:"
pc=$(expr $RANDOM % 3)
read -p "输入你的选择:" user
if [ $pc -eq 0 -a $user -eq 2 ] || [ $pc -eq 1 -a $user -eq 0 ] || [ $pc -eq 2 -a $user -eq 1 ]
then
echo "恭喜你赢了电脑"
elif [ $pc -eq $user ]
then
echo "平局"
else
echo "你输了,再来"
fi
~
或者
#!/bin/bash
echo "这是(石头0 剪刀1 布2)的小游戏,放松一下:"
while true
do
pc=$(expr $RANDOM % 3)
read -p "输入你的选择:" user
if [ $pc -eq 0 -a $user -eq 2 ] || [ $pc -eq 1 -a $user -eq 0 ] || [ $pc -eq 2 -a $user -eq 1 ]
then
echo "恭喜你赢了电脑"
elif [ $pc -eq $user ]
then
echo "平局"
else
echo "你输了,再来"
fi
done
1)for循环的语法结构
for 变量名 in 取值列表
do
命令序列
done
2)for列表的定义
[root@centos01 ~]# cat username.txt
bob
tom
alice
3)创建for循环批量创建用户,设置密码为123456
#!/bin/bash
for name in $(cat user.txt)
do
useradd $name
echo "123456" | passwd --stdin $name
done
4)批量化删除用户
#!/bin/bash
for name in $(cat user.txt)
do
userdel -r $name
done
5)使用for循环ping用户要访问的主机
#!/bin/bash
for ip in $(cat p.txt)
do
ping -c 3 -i 0.2 -W 3 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo "host $ip is up"
else
echo "host $ip is down"
fi
done
[root@centos ~]# for i in {10..1};do echo $i;sleep 1;done
循环规则
#!/bin/bash
for i in {1..9}
do
for j in {1..9}
do
echo $i $j
done
done
乘法表
#!/bin/bash
for i in {1..9}
do
for ((j=1;j<=$i;j++))
do
echo -n "${j}x${i}=$(($i*$j)) "
done
echo
done
1)while的命令结构
while [条件]
do
命令序列
done
2)随机创建20个账户密码设置为123456
[root@centos01 ~]# cat aaa.sh
#!/bin/bash
i=1
while [ $i -le 20 ]
do
userdel -r stu$i
#useradd stu$i
#echo "123456" | passwd --stdin stu$i
let i++
Done
Games时间
猜数字
#!/bin/bash
echo "这是一个猜商品价格(1-1000)的小游戏,猜猜看"
pc=$(expr $RANDOM % 1000 + 1)
cs=0
while true
do
read -p "输入你猜测的价格:" int
let cs++
if [ $int -gt $pc ]
then
echo "价格给高了"
elif [ $int -eq $pc ]
then
echo "恭喜猜对了"
echo "共猜了$cs次"
exit
else
echo "价格给低了"
fi
done
case 变量值 in
模式1)
;;
模式2)
;;
*)
默认命令序列
esac
[root@centos01 ~]# cat ./vsftpd.sh
#!/bin/bash
#chkconfig:35 80 21
#Description:vsftpd Server
case "$1" in
start)
echo "正在启动vsftpd服务[确定]"
;;
stop)
echo "正在停止vsftpd服务[确定]"
;;
restart)
echo "正在重新启动vsftpd服务[确定]"
;;
*)
echo "用法:$0{start|stop|restart}"
esac
[root@centos01 ~]#
例子:
[root@centos ~]# vim /etc/init.d/file
#!/bin/bash
case $1 in
create)
touch /tmp/{1..100}.txt
;;
delete)
rm -rf /tmp/{1..100}.txt
;;
list)
ls -l /tmp/{1..100}.txt
;;
*)
echo "用法:$0{create|delete|list}"
esac
例子:
#!/bin/bash
read -p "请输入一个字符:" str
case $str in
[a-zA-Z])
echo "字母"
;;
[0-9])
echo "数字"
;;
*)
echo "特殊符号"
esac