欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Shell编程之case语句与循环语句

程序员文章站 2022-07-10 09:28:41
...

使用case分支语句

case语句结构

case语句的使用情况是某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。
与if不同的地方在于,if需要判断多个不同的条件,case只是判断一个变量的不同取值。

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

case语句特点

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

## 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循环语句就可以很好的解决这个问题。

for语句的结构

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

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

取值列表中多个变量以空格进行分隔。

shell中let命令

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

let 命令用法
let 表达式

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

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
[[email protected] ~]# 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
[[email protected] ~]# sh practice.sh 
     *
    ***
   *****
  *******
 *********

while循环语句

while语句的结构

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

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

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

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

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
[[email protected]]# 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才执行命令序列。

until语句结构

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

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}发送成功"