Shell脚本之for循环、while循环,if语句、case语句

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 条件             ##满足条件则执行命令1,否则执行命令2 
then  命令1
elif  命令2
 
 
(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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lilygg/article/details/85346827