shell脚本之case-for-while-until语句

一、case多分支语句

1.1、case语句的结构

  • 针对变量的不同取值,分别执行不同的命令序列

  • if语句需要判断多个不同的条件

  • case语句指示判断一个变量的不同取值

格式:
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac

1.2、case语句-实例

  • 1、 输入一个字符判断输入的内容
#!/bin/bash
read -p "请输入一个字符,并按回车键确认:" char
case "$char" in
 [a-z]|[A-Z])
    echo "你输入的是一个字母"
	;;
 [0-9])
    echo "你输入的是一个数字"
	;;
 *)
   echo "你输入的是控制字符、空格"
esa
  • 2、用case语句输入成绩分区
    成绩0-100分
    0-59分:不及格
    60-74:及格
    75-84:良好
    85-100:优秀
#!/bin/bash
read -p "请输入你的成绩:" scorce
case "$scorce" in
8[5-9]|9[0-9]|100)
    echo "你的成绩为优秀"
        ;;
7[5-9]|8[0-4])
    echo "你的成绩为良好"
        ;;
6[0-9]|7[0-4])
    echo "你的成绩为合格"
        ;;
[0-9]|[1-5][0-9])
    echo "你的成绩不及格,好好努力!"
        ;;
*)
  echo "你的输入错误!请重新输入"
esac

二、for循环语句

2.1、for循环语句的结构

  • 读取不同的变量值,用来逐个执行同一组命令
语句结构
for 变量名 in 取值列表
do
	命令序列
done

2.2、for循环语句案例

  • 1、使用for批量添加用户
    用户名存放在users.txt文件中,每行一个
    初始密码均设为123456
ulist=$(cat /mnt/users.txt)
for uname in $ulist
do
     useradd $uname
	 echo "123456" | passwd --stdin $uname &>/dev/null
done
  • 2、ping检测各主机的连通性
    将一些IP地址作为实验测试,放在 /mnt/ip.txt文件里
#!/bin/bash
IP=$(cat /mnt/ip.txt)
for abc in $IP
 do
   ping -c 4 -i 0.2 -w 3 $abc &> /dev/null
   if [ $? -eq 0 ]
   then
   echo "Host $abc is up"
   else
     echo "Host $abc is down"
   fi
done
  • 3、计算1-100偶数的和
    方法一:计算偶数的和
#!/bin/bash
sum=0
for((i=0;i<=100;i+=2))
  do
        let sum+=$i
  done
        echo "总和为:$sum"
  • 方法二:计算偶数的和,取余来判断偶数
#!/bin/bash
sum=0
for((i=1;i<=100;i++))
do
    if [ `expr $i % 2` -eq 0 ]
	then
   let sum+=$i
	fi
done
echo $sum
  • 4、计算1~100的奇数和
#!/bin/bash
sum=0
for((i=1;i<=100;i+=2))
   do
    sum=`expr $i + $sum`
   done
echo $sum

三、while循环语句

3.1、while语句结构

语句结构
while 条件测试操作
do
	命令序列
done

3.2、while语句结构示例

  • 1、用while批量新建20个用户stu1、stu2、…
#!/bin/bash
uname="stu"
i=1
while [ $i -le 20 ]
do
   useradd ${uname}$i
   echo "123456" | passwd --stdin ${uname}$i &> /dev/null
   let i++
done

3.3、猜商品价格游戏

  • 通过变量RANDOM获得随机数

  • 提示用户猜测并记录次数,猜中后退出循环

#!/bin/bash
num=`expr $RANDOM % 1000`
i=0
while true
do 
   read -p "你猜测的数目是:" shu
   let i++
   if [ $shu -eq $num ]
    then 
	  echo "你猜对了,是:$num"
	  echo "你猜了$i 次"
	  exit 0
	elif [ $shu -gt $num ]
	 then
	 echo "太高了"
	else
	  echo "太低了"
	fi
done

四、continue语句和break语句

  • break 用来结束所有循环,循环语句不再有执行的机会
命令格式
continue n
n 表示循环的层数:
如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。这么说可能有点难以理解,稍后我们通过代码来演示。
continue 关键字也通常和 if 语句一起使用,即满足条件时便跳出循环。 
  • continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
命令格式
break n
n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。
break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。

五、untli循环语句

5.1、until语句的结构

  • 重复测试某个条件,只要条件不成立则反复执行
until 条件测试操作
do
 命令序列
done

5.2、until语句示例

  • 为指定用户发送在线消息
    1、交互格式要求
    2、用户:1、存在 2、是否在线
    若用户不在线(未登陆系统),则每7s试一次,直至用户登录后在发送消息
    用户与消息通过为止参数传递给脚本
#!/bin/bash 
username=$1
if [ $# -lt 1 ]
then
    echo "usage:$0 <username><message>"
exit 1
fi
if grep "^$username" /etc/passwd &>/dev/null
then
:
else
  echo "用户不存在"
   exit 2
fi
until who | grep "$username" &>/dev/null
do
    echo "用户不在线"
	sleep 4
done
echo "$2" | write "$username"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值