linux shell中的while循环和case循环

linux shell中的while循环和case循环,第1张

linux shell中的while循环和case循环

1、while循环

while循环是一种判断循环,通过条件表达式,判断结果是真还是假,如果是真则执行命令序列,并循环判断,如果结果为假,则结束判断。
while循环语句再使用时,一定要注意测试条件的改变,如果每次循环判断时,条件没有发生任何改变,则会变成死循环。死循环不是死机,用户可以强制结束脚本或进程。在无限循环的过程中,如果进程占用了所有的硬件资源,则有可能会导致死机。

语法:

while  [  条件表达式 ]
do
    命令序列
done


例:

#!/bin/bash
a=0
while [ $a -le 5 ]
do
    echo $a
    let a++
done


例:使用while语句脚本,创建指定用户名前缀,指定数量的用户,并设置密码为123.com

#!/bin/bash
read -p "请输入用户名:" user1
read -p "请输入创建数量:" num1
a=1
while [ $a -le $num1 ]
do
    useradd $user1$a
    echo "123.com" | passwd $user1$a --stdin
    let a++
done


例:使用while循环,测试主机的连通性。

#!/bin/bash
a=1
while [ $a -le 254 ]
do
    ping 192.168.10.$a -c 1 -i 0.01 -w 1 &> /dev/null
    if [ $? -eq 0 ];then
        echo "主机 192.168.10.$a可以连通。"
    else
        echo "主机 192.168.10.$a不能连通。"
    fi
let a++
done


例:使用while语句脚本求1到100的和

#!/bin/bash
a=0
b=0
while [ $a -le 100 ]
do
    b=$(expr $b + $a)
    let a++
done
echo $b

例:使用while语句,给用户输入密码,两次密码不同时,要求重新输入。

#!/bin/bash
while true
do
stty -echo
read -p "请输入密码:" pass1
printf "n"
read -p "请再次输入密码:"  pass2
printf "n"
stty echo
if  [ -z $pass1 ] || [ -z $pass2 ];then
    echo "密码不能为空,请重新输入"
elif [ $pass1 = $pass2 ];then
    echo "正在给用户设置密码"
    echo $pass1 | passwd $1 --stdin
    exit 0
else
    echo "两次密码不同,请重新输入密码"
fi
done

例:猜猜看,随机生成一个1000以内的整数,猜测数值是多少?

#!/bin/bash
echo "请猜猜看商品价格是多少?"
echo
time=0
num=$(expr $RANDOM % 1000)
while true
do
    let time++
    read -p "请输入数值:" a
    if [ $a -eq $num ];then
        echo "恭喜你猜对了,价格是:$a"
        echo "你总共猜了 $time 次。"
        exit 0
    elif [ $a -gt $num ];then
        echo "价格高了"
    else
        echo "价格低了"
    fi
done


2、case循环

case是一种选择性跳转语句,通过用户指定的变量值,匹配字符串标记,与标记相同的,则执行该标记下的命令序列,不同的,则跳过。直到esac结束。

语法:
case 变量名  in
标记1)
    命令序列
    ;;
标记2)
    命令序列
    ;;
标记3)
    命令序列
    ;;
esac

case语句可以编写菜单选项或者服务管理脚本。

例:编辑一个服务管理脚本。可以使用nfs服务或httpd服务练习。

#!/bin/bash
case $1 in
start)
    systemctl start nfs
    ;;
stop)
    systemctl stop nfs
    ;;
restart)
    $0 stop
    $0 start
    ;;
*)
    echo " 请使用 start | stop | restart 参数"
    ;;
esac


例:制作一个简单的游戏对话菜单

#!/bin/bash
while true
do
    echo "老村长:孩子,我看你骨骼惊奇,是练武奇才,你希望做什么职业?"
    echo "A  猎手"
    echo "B  术士"
    echo "C  机械师"
    echo "D  骑士"
    echo "E  召唤师"
    echo "F  乞丐"
    echo "Q  退出,等等再说"
    read -p "请选择职业:" num
    case $num in
    A|a)
        echo "你选择的职业为猎手,你的初始能力为...."
        ;;
    B|b)
        echo "你选择的职业为猎手,你的初始能力为...."
        ;;
    C|c)
        echo "你选择的职业为猎手,你的初始能力为...."
        ;;
    D|d)
        echo "你选择的职业为猎手,你的初始能力为...."
        ;;
    E|e)
        echo "你选择的职业为猎手,你的初始能力为...."
        ;;
    F|f)
        echo "你选择的职业为猎手,你的初始能力为...."
        ;;
    Q|q)
        exit 0
    esac 
    read -p "你确认以上信息吗?"  yy
    if [ $yy = y ];then
        exit 1
    fi    
    
done

例:使用while与case语句写出交互式界面菜单
菜单内容:
A 显示主机IP地址
B 显示根分区可用空间
C 显示交换分区可用空间
D 显示内存可用空间
E 显示系统时间
Q 退出系统


#!/bin/bash
while true
do
    echo "------傻瓜系统维护工具-------"
    echo
    echo
    echo "1 显示主机IP地址"
    echo "2 显示根分区可用空间"
    echo "3 显示交换分区可用空间"
    echo "4 显示内存可用空间"
    echo "5 显示系统时间"
    echo "6 退出系统"
    echo
    echo
    read -p "请输入选项:" num
    case $num in
        1)
            ifconfig ens33 |grep "inet " | awk '{print $2}'
            ;;    
        2)
            df | grep "/$" |awk '{print $4}'
            ;;
        3)
            free |grep "Swap" |awk '{print $4}'
            ;;
        4)    
            free |grep "Mem" |awk '{print $4}'
            ;;
        5)
            date
            ;;
        6)
            exit 0
    esac
done


例:利用while循环在屏幕上显示一个5x5的*

#!/bin/bash
a=1
while [ $a -le 5 ]
do
    b=1
    while [ $b -le 5 ]
    do
        echo -n "*"
    let b++
    done
echo
let a++
done


例:使用循环语句在屏幕上用*号组成的,显示指定行数的菱形

#!/bin/bash
read -p "请输入*号的行数:" long
for((i=1;i<=$long;i++))              #图形上半部分
do
    for((j=$long;j>i;j--))
    do
        echo -n " "
    done
    for m in `seq 1 $i`
    do
        echo -n "*"
    done
    #for((n=1;n     for n in `seq 2 $i`
    do
        echo -n "*"
    done
    echo ""
done

for((i=2;i<=$long;i++))    #图形下半部分
do
    for ((j=1;j     do
        echo -n " "
    done

    let k=$long+1-$i

    for m in `seq 1 $k`
    do
        echo -n "*"
    done
    for ((n=1;n     #for n in `seq 2 $k`
    do
        echo -n "*"
    done
    echo ""
done


练习:

1、使用while语句,给指定的用户输入密码,两次密码不同时,要求重新输入,并且判断密码不能为空,如果为空,也要求重新输入。

2、使用while与case语句写出交互式界面菜单
菜单内容:
    1  配置网卡IP地址
    2  设置共享目录
    3  查看指定服务的工作状态
    4  测试指定主机的通讯状态
    5  给本地主机添加交换分区容量
    q  退出

3、使用while语句编写99乘法表

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5610104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存