1. for循环
一般格式:
格式1:
for((条件))
do
动作
done
格式2:
for 变量名 in 范围
do
动作
done
实验:
##1. 输出数字:1-5
[root@localhost ~]# vim for01.sh
###################
#!/bin/bash
for NUM in {1..5}
do
echo $NUM
done
[root@localhost ~]# sh for01.sh
1
2
3
4
5
##2.将输出数字:1-6 并且 间隔为2
[root@localhost ~]# vim for02.sh
###################
#!/bin/bash
for NUM in `seq 1 2 6` ## 2表示步长
do
echo $NUM
done
[root@localhost ~]# sh for02.sh
1
3
5
示例1:检测所有1-60的ip网络通信状态
[root@localhost mnt]# vim ip_check.sh
#####################
#!/bin/bash
for((i=1;i<=60;i++))
do
ping -c1 -w1 172.25.254.$i > /dev/null && echo 172.25.254.$i is UP || echo 172.25.254.$i is DOWN
sleep 1
done
注释:
> /dev/null ##将冗余的输出信息导入到垃圾箱中
sleep 1 ##每秒刷新一次
&& ##表示若能与主机能进行通信则输出....UP
|| ##表示若不能与主机进行通信则输出....DOWN
[root@localhost mnt]# sh ip_check.sh
示例2:10s倒计时
[root@localhost mnt]# vim time.sh
#####################
#!/bin/bash
for((i=10;i>0;i--))
do
echo -n " After $i's is end "
echo -ne "\r"
sleep 1
done
注释:
\r ##表示回车:覆盖之前的输出(注意:必须加-e解析)
sleep 1 ##表示每秒刷新1次
[root@localhost mnt]# sh time.sh
练习1:用户以 分:秒 格式输入时间 进行倒计时
编写脚本:
[root@localhost mnt]# vim time_ms.sh
#####################
#!/bin/bash
read -p 'please input minute:' a ##用变量a来接收用户输入的分钟
read -p 'please input second:' b ##用变量b来接收用户输入的秒钟
[ "$b" -gt 60 ]&&{ ##判断输入的秒钟是否符合实际,一般秒位不超过为60即为一分钟(其实不做判断也可以的)
echo "EROOR: please input a correct second!"
exit 1
}
c=$[$a*60+$b] ##将分钟和秒都化为以秒为单位;转换关系:一分钟等于60秒
for((;c>=0;c--))
do
m=$[$c/60] ##计算新的分钟
s=$[$c%60] ##计算新的秒钟
echo -n "Time is $m:$s "
echo -ne "\r" ##覆盖前一秒的输出信息
sleep 1 ##每秒刷新一次
done
执行脚本:
[root@localhost mnt]# sh time_ms.sh
[root@localhost mnt]# sh time_ms.sh
2. while循环
一般格式:
while 条件
do ##满足条件则执行动作
动作
done
实验:
[root@localhost ~]# vim while.sh
###################
while true ## 死循环,若没有外界条件的干扰,则会一直循环不停止
do
echo -n `uptime`
echo -ne "\r" ## -e表示解析 ,-r表示回车,即覆盖上一秒的输出信息
sleep 1 ## 每秒刷新一次
done
[root@localhost ~]# sh while.sh
^C:37:17 up 58 min, 3 users, load average: 0.14, 0.05, 0.06
示例3:批量创建用户并给其设定密码为123
##非交互式设定用户密码
[root@localhost mnt]# echo "123" | passwd student --stdin
[root@localhost mnt]# ls /home
student
[root@localhost mnt]# sh user.sh
#####################
#!/bin/bash
USERNAME="westos"
i=1
while [ $i -le 10 ] ##当满足表达式时则执行do中的命令
do
useradd ${USERNAME}$i ##创建用户
echo "123" | passwd ${USERNAME}$i --stdin &> /dev/null ##非交互式设定用户密码
((i++))
done
[root@localhost mnt]# sh user.sh
测试:
##检验用户是否创建成功
[root@localhost mnt]# ls /home/
student westos10 westos3 westos5 westos7 westos9
westos1 westos2 westos4 westos6 westos8
##检验密码是否设定成功
[root@localhost mnt]# su - westos1
[westos1@localhost ~]$ su - westos2
Password:
[westos2@localhost ~]$ exit
logout
[westos1@localhost ~]$ exit
logout
3.嵌套循环
1. for循环的嵌套
for((条件))
do
for((条件))
do
动作
done
done
2.while循环的嵌套
while 条件
do
while 条件
do
动作
done
done
示例4:打印乘法口诀表
分析:乘法口诀表有9行9列,并且当前的行数等于当前的列数,即第1行有1个等式,第2行有2个等式;显示需要用到嵌套循环
方法1:
[root@localhost mnt]# vim 9*9.sh
#####################
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
echo -n "$i*$j=$[$i*$j] "
done
echo -e "\n" ##\n表示换行;注意:必须加-e解析
done
[root@localhost mnt]# sh 9*9.sh
方法2:
[root@localhost mnt]# vim 9*9.sh
####################
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
echo -ne "$i*$j=$[$i*$j]\t" ##-t表示4个空格
if ##注意:if语句中的条件必须有空格才能生效
[ $i = $j ]
then
echo -e "\n"
fi
done
done
[root@localhost mnt]# sh 9*9.sh
4. if语句
if语句的一般形式:
(1).单个条件
if 条件
then 执行命令
fi
if 条件1
then 执行命令1
else 执行命令2
fi
(2).多个条件
if 条件1
then 执行命令1
elif 条件2
then 执行命令2
.....
else 执行命令3
fi
几种常见的退出方式:
exit ##退出当前脚本
break ##退出当前循环
continue ##提前退出当前循环,进入下一次循环
注意:eq不能用于比较字符串,比较字符串只能用 ==
实验:
[root@localhost ~]# vim if.sh
###################
#!/bin/bash
for NUM in {1..5}
do
if [ "$NUM" -eq 3 ]
then
$1 ## $1表示脚本后跟的第一串字符
fi
echo $NUM
done
echo hello linux!
[root@localhost ~]# sh if.sh
1
2
3
4
5
hello linux!
[root@localhost ~]# sh if.sh exit
1
2
[root@localhost ~]# sh if.sh break
1
2
hello linux!
5. case语句
一般用于多个条件的判断
(1) case语句的一般格式
case 变量名 in
常量1) ##可以用于判断多个条件;当常量1与变量名相同时,执行命令1,以此类推
命令1
;;
常量2)
命令2
esac
(2) if语句与case语句的区别
if语句中的条件判断是从上到下顺序依次判断
case语句中的条件判断是同步的
实验:
[root@localhost ~]# vim case.sh
###################
case $1 in ## 脚本后跟的第一串字符为dog时输出cat,为cat时输出dog,为其他时输出ERROR报错信息
dog)
echo cat
;;
cat)
echo dog
;;
*)
echo ERROR: Please input cat or dog !!!
esac
[root@localhost ~]# sh case.sh
ERROR: Please input cat or dog !!!
[root@localhost ~]# sh case.sh cat
dog
[root@localhost ~]# sh case.sh dog
cat
示例5:用户输入以下几个选项,实现相应的功能:
A 显示主机ip
B 显示磁盘剩余空间
C 显示系统运行时间
D 退出系统
分析:
##只输出ip
[root@localhost mnt]# ifconfig eth0 | grep "inet " | awk '{print $2}'
172.25.254.166
##第一行的Availabe表示磁盘剩余空间
[root@localhost mnt]# df
[root@localhost mnt]# df | awk 'NR==2' | awk '{print "磁盘剩余空间为:" $2}'
[root@localhost mnt]# uptime | awk '{print $3}' | awk -F, '{print $1}' | awk -F: '{print "系统已经运行:" $1 "小时" $2 "分钟"}'
编写脚本:
[root@localhost mnt]# vim mutual.sh
#####################
echo -e "\033[35m A 显示主机IP \033[0m " ##显示菜单
echo -e "\033[32m B 显示磁盘剩余空间 \033[0m "
echo -e "\033[33m C 显示系统运行时间\033[0m "
echo -e "\033[31m Q 退出系统 \033[0m "
while true ## 无限循环
do
read -p "please input a cheracter (A/B/C/Q): " i
case $i in
A|a)
echo -e "\033[35m ` ifconfig eth0 | grep "inet " | awk '{print $2}' ` \033[0m "
;;
B|b)
echo -e "\033[32m `df | awk 'NR==2' | awk '{print "磁盘剩余空间为:" $2}' ` \033[0m "
;;
C|c)
echo -e "\033[33m ` uptime | awk '{print $3}' | awk -F, '{print $1}' | awk -F: '{print "系统已经运行:" $1 "小时" $2 "分钟"}' ` \033[0m "
;;
Q|q)
echo -e "\033[34m good bye ~ \033[0m "
exit 1
;;
*)
echo -e "\033[31m ERORR: Please input a correct character \033[0m "
esac
done
注释:
\033[35m \033[0m ##35表示颜色 0m表示关闭属性;注意:必须加-e解析才能识别颜色
while true ##表示这是一个无限循环;即为死循环
case ##case语句用于多个条件
执行脚本:
[root@localhost mnt]# sh mutual.sh