shell编程--case语句与循环语句(case语句编程、for循环语句编程中九九乘法表与等腰三角形、while、until循环语句编程)

一、 使用case分支语句

1.1 case语句结构

case语句的使用情况是某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。

与if不同的地方在于,if需要判断多个不同的条件,case只是判断一个变量的不同取值。

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

1.2 case语句特点

  • case的行尾必须为单词“in”,每一个模式都要以右括号“)”结束。
  • 双分号“;;”表示命令序列的结束
  • 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以用竖 杠符号“|”表示或,如"A|B"。
  • "*)"表示默认模式,其中的 " * " 相当于通配符
  • case支持通配符:
    *: 任意长度任意字符
    ?: 任意单个字符
    []:指定范围内的任意单个字符

1.3 case示例

#!/bin/bash                   //声明脚本运行的环境
read -p "请输入成绩:" GRADE    //定义变量GRADE,并输入提示消息
case "$GRADE" in              //变量GRADE要遍历的集合
 8[5-9]|9[0-9]|100)           //表示85-89,90-99.100分的人是优秀
  echo "优秀"
  ;;                          //case语句之间要用;;表示上一个命令结束
 7[0-9]|8[0-4])
  echo "良好"
  ;;
 6[0-9])
  echo "合格"
  ;;
 [0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])
  echo "不合格"
  ;;
 *)
  echo "请输入0-100内的成绩"     //定义不属于上面条件的情况
esac                           //结束

二、 for循环语句

当遇到某个任务需要多次执行,而每次执行处理只是对象不一样,其他命令都相同,当面对任务重复任务时,简单的if语句难以满足要求,for循环语句就可以很好的解决这个问题。

2.1 for语句的结构

for循环语句需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环,这个过程也叫做“遍历”。
这里的取值列表称为for语句的执行条件,需要提前指定。
for循环语句的语法结构:

for 变量名 in 取值列表
do
   命令序列
done

在这里插入图片描述
取值列表中多个变量以空格进行分隔。

2.1.1 shell中let命令

let 对整数进行数学运算,和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

let 命令用法
let 表达式

当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号或者单引号将表达式包围起来。和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。

2.2 for语句示例

九九乘法表

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9
do
  for j in 1 2 3 4 5 6 7 8 9
  do
    if [ $i -ge $j ]
    then
      echo -ne "$i*$j=$[$i*$j]\t "   //echo -e表示支持反斜线控制的字符转换;echo -n表示输出结果后不换行;\t表示制表符,让形式看起来更美观
    fi
  done
  echo ""
done
[root@localhost ~]# sh 99.sh 
1*1=1	 
2*1=2	 2*2=4	 
3*1=3	 3*2=6	 3*3=9	 
4*1=4	 4*2=8	 4*3=12	 4*4=16	 
5*1=5	 5*2=10	 5*3=15	 5*4=20	 5*5=25	 
6*1=6	 6*2=12	 6*3=18	 6*4=24	 6*5=30	 6*6=36	 
7*1=7	 7*2=14	 7*3=21	 7*4=28	 7*5=35	 7*6=42	 7*7=49	 
8*1=8	 8*2=16	 8*3=24	 8*4=32	 8*5=40	 8*6=48	 8*7=56	 8*8=64	 
9*1=9	 9*2=18	 9*3=27	 9*4=36	 9*5=45	 9*6=54	 9*7=63	 9*8=72	 9*9=81

等腰三角形

#!/bin/bash
for ((i=5;i>=1;i--))
 do
   for((j=1;j<=i;j++))
     do
      echo -n " "     //echo -n表示不转行
     done
   for ((k=0;k<=2*(5-i);k++))
     do
      echo -n "*"
     done
    echo ""
 done
[root@localhost ~]# sh practice.sh 
     *
    ***
   *****
  *******
 *********

三、 while循环语句

3.1 while语句的结构

for语句适合列表对象没有规律且列表来源已固定的场合。对于要求循环次数、按特定条件执行重复的操作等情况,while语句就更加适合。
while语句结构如下

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

while语句有两个特殊的条件测试操作,true(真)和false(假),只有当条件测试为true时,才会执行命令序列。

这里的条件成立有可能带来死循环的情况,我们可以在某些情况下利用死循环,加上条件判断语句我们就可以实现我们的目的,最后用一个exit语句退出脚本。
在这里插入图片描述

3.2 while语句应用实例

猜价格

随机生成一个价格,通过死循环与if条件判断,猜价格
#!/bin/bash
jiage=$(expr $RANDOM % 1000)
i=0
while true          使判断恒为true
do
   read -p "请输入您认为的价格:" num
   let i++
   if [ $num -eq $jiage ]
   then
      echo "恭喜你,猜对了"
      echo "你总共猜了$i次"
      exit 0
   elif [ $num -le $jiage ]
   then
      echo "低了"
   else
   echo "高了"
   fi
done

批量创建/删除用户

批量创建用户,用户名称以stu开头,按数字进行编号,添加20个用户,并设置密码为123456
#!/bin/bash
name="stu"
i=1
while [ $i -le 20 ];do
   useradd $name$i
   echo "123456" | passwd --stdin $name$i
   let i++
done
[root@localhost shell]# sh chuanjian.sh 
更改用户 stu1 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu2 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu3 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu4 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu5 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu6 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu7 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu8 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu9 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu10 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu11 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu12 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu13 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu14 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu15 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu16 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu17 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu18 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu19 的密码 
passwd:所有的身份验证令牌已经成功更新。
更改用户 stu20 的密码 
passwd:所有的身份验证令牌已经成功更新。
批量删除用户的脚本
#!/bin/bash
name=stu
i=1
while [ $i -le 20 ];do
   userdel -r $name$i
   let i++
done

四、 until循环语句

与while语句正好相反,while语句是判定成功则执行命令序列,until则是判断为false才执行命令序列。

4.1 until语句结构

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

在这里插入图片描述

4.2 until语句应用实例

计算和值

计算1-50的和值
#!/bin/bash
i=1
sum=0
until [ $i -gt 50 ]
do
 #let sum+=$i   这一行的内容等于 sum=$(($sum+$i))
  sum=$(($sum+$i))
  let i++
done
  echo $sum

综合语句

为指定用户发送在线消息
若指定用户不在线(未登陆系统),则每10分钟(实验中为了测试效果,可改为3s)试一次,直至用户登录系统后再发送信息
用户名与消息通过为止参数传递给脚本

#!/bin.bash
username=$1
#格式参数不能为空
if [ $# -lt 1 ]
then
   echo "Usage:`basename $0` <username> [<message>]"
   exit 1
fi
#验证是否属于系统用户
if grep "^$username" /etc/passwd > /dev/null
then :
else
   echo "not user"
   exit 2
fi
#测试用户是否在线,如果不在线,每5s联系一次
until who | grep "$username" > /dev/null
do
   echo "user not login"
   sleep 5
done
echo "$2" | write "$username"
echo "${username}发送成功"

猜你喜欢

转载自blog.csdn.net/kimowinter/article/details/107458051