case语句的使用情况是某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。
与if不同的地方在于,if需要判断多个不同的条件,case只是判断一个变量的不同取值。
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
*)
默认命令序列
esac
#!/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 //结束
当遇到某个任务需要多次执行,而每次执行处理只是对象不一样,其他命令都相同,当面对任务重复任务时,简单的if语句难以满足要求,for循环语句就可以很好的解决这个问题。
for循环语句需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环,这个过程也叫做“遍历”。
这里的取值列表称为for语句的执行条件,需要提前指定。
for循环语句的语法结构:
for 变量名 in 取值列表
do
命令序列
done
let 对整数进行数学运算,和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
let 命令用法
let 表达式
当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号或者单引号将表达式包围起来。和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。
#!/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
*
***
*****
*******
*********
for语句适合列表对象没有规律且列表来源已固定的场合。对于要求循环次数、按特定条件执行重复的操作等情况,while语句就更加适合。
while语句结构如下
while 语句结构
while 条件测试操作
do
命令序列
done
while语句有两个特殊的条件测试操作,true(真)和false(假),只有当条件测试为true时,才会执行命令序列。
这里的条件成立有可能带来死循环的情况,我们可以在某些情况下利用死循环,加上条件判断语句我们就可以实现我们的目的,最后用一个exit语句退出脚本。
随机生成一个价格,通过死循环与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
与while语句正好相反,while语句是判定成功则执行命令序列,until则是判断为false才执行命令序列。
until 语句结构
until 条件测试操作
do
命令序列
done
计算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` []"
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}发送成功"