shell 编程 while循环

while循环

循环语句常用于重复执行一条指令或一组指令,直到条件不满足停止,shell脚本语言的循环语句常见的有while、until、for、select循环语句,其中,until和select已经基本淡出历史舞台。本章讲while循环
while循环语句主要用来重复执行一组命令会语句。在企业中常用于守护进程或持续运行的程序,也有时候会用while来读取文件的每一行内容

7.1 while语法

while循环的基本语法为:

while <条件表达式>
do
    指令
done

while <条件表达式>;do
    指令
done

while循环会对紧跟在while后的条件表达式判断,如果条件成立,就执行while里面的命令或语句,每次执行到done时候就重新判断while表达式是否真的成立,直到表达式不成立才退出while循环体,如果一开始就不成立,就不会进入循环体,
while循环执行的流程图如下所示:


9469008-200f11938659eae9.png
file

while按行读入文件

while可以读取指定的文件,然后可以对每行数据进行自定义处理,一共有三种方式:
 exec方式,仅供了解

exec < file
sum=0
while read line
do
    echo $line
done

 cat方式

cat file | while read line
do 
    echo $line
done

 <重定向输入方式(推荐使用的方式)

while read line
do
    echo $line
done < file

练习:
while循环从1加到100,然后再额外使用两种方式计算1
while循环读入数据,计算文件内的年龄平均值
将第6章的练习1,改为死循环的形式。菜单中加入选项exit,只有输入exit才能退出
解决
while循环从1加到100,然后再额外使用两种方式计算1

a=0
sum=0
while [ $a -lt 100 ];do
    let a++
    let sum=$sum+$a
done
echo $sum                           

执行结果

[root@shell ~]# sh while.sh
5050

while循环读入数据,计算文件内的年龄平均值

a=0
sum=0
while read line;do
    let a++
age=`echo $line|awk '{print $2}'`
let sum=$age+$sum
done<$1
echo $sum / $a|bc         

操作结果

[root@shell /server/scripts]# cat nling.txt 
xiaohong 22
xiaoli   23
xiaoming 33
xiaojuan 32
xiaoqiang 21
[root@shell /server/scripts]# sh  age.sh nling.txt
26

案例实操

1、猜数字游戏:首先让系统随机生成一个数字,给这个数字定一个范围,让用户输入猜的数字,对输入的数字进行判断,如果不符合要求,就给与高或低的提示,猜对后给出猜对用的次数,请用while语句实现。
2、使用if和while实现菜单系统信息案例:
h 显示命令帮助
f 显示登录信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
3、while循环案例,可以批量创建10个用户,并通过传参方式传入密码123
创建用户:
useradd test1
添加密码:
echo 123 | passwd --stdin test1
批量创建
seq 1 10
4、使用case和while循环批量删除用户[y|n]
5、while循环通过文本来直接创建用户和密码,如果用户存在或者创建失败给予提示
解决:
1、猜数字游戏:首先让系统随机生成一个数字,给这个数字定一个范围,让用户输入猜的数字,对输入的数字进行判断,如果不符合要求,就给与高或低的提示,猜对后给出猜对用的次数,请用while语句实现。

#生成随机数1-100
function game(){
mun=`echo $((RANDOM%100+1))`
coont=0
x=1
sleep 2
clear
echo "======* 欢迎玩家登录本游戏 *======" 
echo "数字范围在 1-100之间"
echo "请输入你猜测的数字"
while [ "$x" -eq 1 ];do
read -p '请输入: ' m
let coont=$coont+1
if [ "$m" -gt "$mun" ];then
    echo '猜大了!!!'
elif [ "$m" -lt "$mun" ];then
    echo "猜小了!!!"
else
    echo '恭喜你猜对了!本场游戏结束'
    echo "你使用的次数是$coont"          
    x=2
fi
done
}
game
while true;do
echo "======* 是否开始新的游戏 Y or N *======"
read -p '请输入: ' n
if [[ "$n" = "Y" ]];then
    game
elif [[ "$n" = "N" ]];then
     echo "======* 退出游戏成功,恭候玩家下次登录游戏 *======"
    exit 0
else

    echo "输入有误请重新输入"
fi
done                                                            

执行结果

[root@shell /server/scripts]# sh caishuzhi.sh                                               
======* 欢迎玩家登录本游戏 *======
数字范围在 1-100之间
请输入你猜测的数字
请输入: 44
猜小了!!!
请输入: 76
猜大了!!!
请输入: 55
猜小了!!!
请输入: 67
猜小了!!!
请输入: 73
恭喜你猜对了!本场游戏结束
你使用的次数是5
======* 是否开始新的游戏 Y or N *======
请输入: N
======* 退出游戏成功,恭候玩家下次登录游戏 *======

2、使用if和while实现菜单系统信息案例:

function menu(){
cat <<EOF
        h 显示命令帮助
        f 显示登录信息
        d 显示磁盘挂载
        m 查看内存使用
        u 查看系统负载
        q 退出程序
EOF
}

sleep 2
clear
menu
while true;do
danxitong.sh" 52L, 983C                                          
elif [ "$m" = d ];then
    echo '加载磁盘挂载信息'
    sleep 1
    who
    fdisk -l
elif [ "$m" = m ];then
    echo '加载内存使用情况'
    sleep 1
    free -m
elif [ "$m" = u ];then
    echo '加载系统负载'
    sleep 1
    who
    w
elif [ "$m" = q ];then
    exit 1
else
    echo '输入有误请重新输入'
fi
done

执行结果

[root@shell /server/scripts]# sh caidanxitong.sh
        h 显示命令帮助
        f 显示登录信息
        d 显示磁盘挂载
        m 查看内存使用
        u 查看系统负载
        q 退出程序
请选择你要选择的功能: f
加载登陆信息:
root     pts/0        2019-07-20 12:53 (10.0.0.1)
root     pts/1        2019-07-20 13:07 (10.0.0.1)
root     pts/2        2019-07-20 13:31 (10.0.0.1)
请选择你要选择的功能: d
加载磁盘挂载信息
root     pts/0        2019-07-20 12:53 (10.0.0.1)
root     pts/1        2019-07-20 13:07 (10.0.0.1)
root     pts/2        2019-07-20 13:31 (10.0.0.1)

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000e0dab

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/sda3         4196352    41943039    18873344   83  Linux
请选择你要选择的功能: m
加载内存使用情况
              total        used        free      shared  buff/cache   available
Mem:            972          98         752           7         121         728
Swap:          1023           0        1023
请选择你要选择的功能: u
加载系统负载
root     pts/0        2019-07-20 12:53 (10.0.0.1)
root     pts/1        2019-07-20 13:07 (10.0.0.1)
root     pts/2        2019-07-20 13:31 (10.0.0.1)
 13:45:39 up 51 min,  3 users,  load average: 0.01, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         12:53   40:51   1.21s  0.59s vim nginx
root     pts/1    10.0.0.1         13:07    3.00s  0.32s  0.00s w
root     pts/2    10.0.0.1         13:31   13:47   0.07s  0.07s -bash
请选择你要选择的功能: h
加载菜单:
        h 显示命令帮助
        f 显示登录信息
        d 显示磁盘挂载
        m 查看内存使用
        u 查看系统负载
        q 退出程序
请选择你要选择的功能:q

3、while循环案例,可以批量创建10个用户,并通过传参方式传入密码123

read -p "请输入用户名的前缀: " m
read -p "请输入希望创建的用户数:" n
read -p "请输入用户的密码:" p

expr $n + 1 &> /dev/null

if [ $? -ne 0 ];then 
    echo "请输入正确的数字"
    exit
fi

a=1
while [ $a -le $n ];do
    user=$m$a
    let a++
    id $user &> /dev/null
    if [ $? -eq 0 ];then
        echo "用户" $user "已存在,创建失败"
        continue
    else
        useradd $user
        if [ $? -eq 0 ]; then
            echo "创建" $user "成功"
        fi
    fi
done


a=1
while [ $a -le $n ];do
    user=$m$a
    let a++
    
    echo $p | passwd --stdin $user &> /dev/null

    if [ $? -eq 0 ];then
        echo "用户" $user "密码修改成功"
    else
        echo "用户" $user "密码修改失败"
    fi
done

4、使用case和while循环批量删除用户[y|n]

read -p "请输入用户名的前缀: " m
read -p "请输入希望删除的用户数:" n

expr $n + 1 &> /dev/null

if [ $? -ne 0 ];then 
    echo "请输入正确的数字"
    exit
fi

a=1
while [ $a -le $n ];do
    user=$m$a
    let a++
    read -p "是否确定删除?[y|n]" input
    case $input in 
        y)

        userdel -r $user &> /dev/null
        if [ $? -ne 0 ];then
            echo "用户" $user "删除失败"
        else
            echo "用户" $user "删除成功"
        fi
            ;;
        n)
            exit
            ;;
        *)
            echo "cuowu!!!"
            exit
    esac
done

1、猜数字游戏:首先让系统随机生成一个数字,给这个数字定一个范围,让用户输入猜的数字,对输入的数字进行判断,如果不符合要求,就给与高或低的提示,猜对后给出猜对用的次数,请用while语句实现。

function changepw(){
    echo $2 | passwd --stdin $1 &> /dev/null
    if [ $? -eq 0 ];then
        echo "密码修改成功"
        return 0
    else
        echo "密码修改失败"
        return 1
    fi
}

while read line; do
    user=`echo $line | awk '{print $1}'`
    pass=`echo $line | awk '{print $2}'`

    # 判断用户是否存在
    id $user &> /dev/null
    if [ $? -eq 0 ];then
        echo "用户" $user "已存在"
    else
        useradd $user &> /dev/null
        # 创建用户是否成功
        if [ $? -eq 0 ];then
            echo "用户创建成功"
            # 修改密码
            changepw $user $pass
        fi
    fi
done < $1

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值