脚本趋势:自动化、可视化
编写一个好脚本的要素:
- 逻辑结构清晰
- 脚本可以重用
- 多加入注释
学会调试脚本:
- echo配合exit命令或sleep命令–》退出脚本|等待几秒继续,默认1s
- bash -x 脚本–》看到脚本的执行过程
- read 断点功能
while语句
while 条件
do
执行动作
done
①例子1:
#!/bin/bash
i=1
while ((i<=10)) --》while后面可以空格
do
echo $i
sleep 0.3
((i++))
done
②例2:间接引用
#!/bin/bash
i=1
while ((i<=$#)) --》位置变量的个数
do
echo ${!i} --》间接引用
((i++))
done
执行结果:
间接引用:
③while read 文件里的变量名
例3:
user.txt:
#cat while3.sh:
#!/bin/bash
while read age name sex address -->变量名
do
echo -e "$age\t$name\t$sex\t$address"
done <user.txt --》输入重定向
执行结果:
分析:
- while配合read从文件里取东西的时候,是一行一行的取出。以空白(空格和tab)作为分隔符,再赋值给read后面接的变量,会根据变量的个数一一对应。
- 如果只有一个变量,就将整行给这个变量,如果有多个变量,变量的数量和分隔出来的字段相等,则一一对应给变量,如果分隔出来的字段大于变量的数量,则将多出来的字段一起给最后一个变量,如果变量的数量超过分隔出来的字段的数量,则多余的变量为空值。
④管道 + while read 变量名 –》也是从文件读取!!
例4:
#!/bin/bash
n=1
cat /etc/passwd|while read line
do
echo -e "chinaitsoft:\t$n \t$line"
((n++))
done
执行结果:
死循环的危害:
主要看死循环里做什么事情
- 1.消耗cpu –》计算类型
- 2.磁盘i/o –》dd
- 3.消耗内存
- 4.消耗网络带宽 –》不停地下载
⑤死循环消耗cpu、内存的例子:
#cat while4.sh
i=1
while true
do
echo “$i”
((i++))
bash /lianxi/while4.sh
done
每次产生1个1M大小的文件来消耗内存的例子:
#cat while4.sh
i=1
while true
do
echo “$i”
((i++))
(dd if=/dev/zero of=dd.dd$i bs=1M count=1)&
done
--》每次产生1个1M大小的文件,并且放到后台去运行。
跳出死循环的方法:
- exit:退出脚本
- break:跳出循环(for、while、until)
⑤跳出死循环
只有输入end才结束,否则一直在输入状态
#!/bin/bash
while :
do
read -p "Please input:" str
if [[ "$str" = "end" ]]
then
break
fi
done
执行结果:
小结:
1.while如何控制循环的次数?
- 读文件时,循环次数看文件里有多少行
- 定义变量,根据变量的值来控制
while (( i<=10 ))
2.while循环里,死循环的语法有哪几种?怎么跳出死循环?
①
- while :
- while true
- while [1]
②
- break
- exit
3.循环结束不代表脚本结束!脚本的执行是从上而下执行的!!
练习:
每2秒钟输出一次系统时间。
解析:不停输出–》死循环while–》sleep 2–》时间格式:年月日时分秒
答案:
#!/bin/bash
while :
do
echo $(date +%F' '%H:%M:%S) >>/lianxi/timeout.txt
sleep 2
done
[或者:date +'%Y-%m-%d %H%M%S']
练习2:
用while循环批量添加20个用户,要求:
①用户名称以stu开头,按数字顺序进行编号
②一共添加20个用户,即stu1、stu2……
③初始密码均设置为123456
答案:
#!/bin/bash
a="stu"
i=1
while (( i<=20 ))
do
useradd $a$i
echo "123456"|passwd --stdin $a$i &>/dev/null
(( i++ ))
done
假如用户名在一个文件里,怎么解决?
#!/bin/bash
cat username.txt|while read name pass --》name pass 叫啥都行
do
id $name &>/dev/null||useradd $name
echo "$pass"|passwd $name --stdin &>/dev/null
done
(||:或符号,id命令执行不成功,才执行后面的命令)
练习3:
分析当前主机中所有用户,哪些是普通用户,哪些是系统用户。
分析:
看 passwd文件的UID,uid>500则为普通用户,uid<500则为系统用户,
uid怎么从passwd文件里弄出来,uid>500的用户怎么弄出来,怎么嵌套进循环里。
答案:
#!/bin/bash
cat /etc/passwd|tr ":" " "|while read username x uid gid --》用户名给username变量,x给x变量,uid给uid变量,其他的给gid这个变量,while取出来是一行一行的取出。
do
if ((uid>500))
then
echo "$username is general user."
elif ((uid==0))
then
echo "$username is super user."
else
echo "$username is system user."
fi
done
(闪烁功能:#echo -e"\e[5;33mHello,Word\e[0m"
而且是显示黄色,并且闪烁)
练习:猜商品价格游戏
猜唐僧的紫金钵价值多少~
①通过变量RANDOM获得价格
②提示用户猜测并记录次数,猜中后退出循环
分析:随机产生价格(1-100),给与提醒,价格高了/低了,记录猜的次数,如果猜的次数大于10次,输出you are bajie;5次,you are wukong;1次,you are rulai。并且猜中后退出循环,没有猜中就一直猜。。
答案:
#!/bin/bash
time=0
a=$((RANDOM%100))
while :
do
read -p "Please input the price between 1 and 100:" price
((time++))
if ((price==a))
then
echo "Bingo!!You guess it!"
echo "The time that you guess is :$time"
break
elif ((price>a))
then
echo "The $price is 高了!!"
else
echo "The $price is 低了!!"
fi
done
if ((time==1))
then
echo "You are rulai!"
elif ((time<5 && time>1))
then
echo "You are wukong!!"
elif ((i<=10))
then
echo "You are bajie!!"
else
echo "You are loser..."
fi
练习:给登录到当前主机的所有非root用户终端发送一句话:“用户名:Hi,I’m Root!”
答案:
#!/bin/bash
w|tail -n +3|while read user TTY other --》w命令显示连接到本机的所有用户
do
if [[ "$user" != "root" ]]
then
echo "Hello $user,I am Root!" >/dev/$TTY
fi
done
执行结果:
另起一个终端,
shift迁移语句
用于迁移位置变量,将
1
9 依次向左传递。
例如,若当前脚本程序获得的位置变量如下:
$1=file1、$2=file2、$3=file3、$4=file4
则执行一次shift命令后,各位置变量为:
$1=file2、$2=file3、$3=file4
再次执行shift命令后,各位置变量为:
$1=file3、$2=file4
(把后面的往前挪。。相当于把前面的挨个删除了)
其实每shift一次,$#位置变量的总数会发生变化,同时会重新排序。
eg:
#!/bin/bash
while (($#>0))
do
echo "\$ is $1"
sleep 0.3
shift
done
执行结果:
until语句
until 条件为假
do
动作
done
(until条件为真时,才结束循环。与while的用法正好不同。)
例:字符串的比较
芝麻开门:直到说出芝麻开门才停,否则一直说“山无棱,天地合,才敢与君绝。”
答案:
#!/bin/bash
until false
do
read -p "山无棱,天地合,才敢与君绝:" PIN
if [[ $PIN == "open door" ]]
then
echo "your answer is OK!"
break
fi
done
执行结果:
搭建ftp服务器:
1.安装软件
#yum install vsftpd
2.启动ftp服务
#service vsftpd restart(centos6版本)
#/bin/systemctl restart vsftpd.service(centos7版本里)
3.查看ftp服务器的状态(在本机上执行)
#service vsftpd status(centos6版本)
#/bin/systemctl status vsftpd.service(centos7版本里)
在别的机器上监控ftp服务器状态(nc命令)
①在监控的机器上安装nc命令
#yum install nc
②在被监控的机器上关闭防火墙,允许访问21号端口
#iptables -F
③#nc -z 172.16.145.188 21 –》只是扫描端口,不发送数据,所以速度快。
若显示 succeeded!,则证明对方的ftp服务是好的。
#echo $? –》通过返回值得到对方ftp服务是否开启
查看端口是否开启:
#lsof -i:21