一、使用case分支语句
1、case语句的结构
(1)适用情况:某个变量存在多种取值,需要对每种取值分别执行不同命令
(2)格式
case 变量值 in
模式1)
命令
;;
模式2)
命令
;;
*)
命令
esac
(3)注意
①case尾行必须为单词in,每一模式必须用右括号)结束
②双分号;;表示命令序列结束
③模式字符串中,可用方括号表示一个连续的范围,如[0-9];还可以用竖杠|表示或,如A|B
④最后的*)表示默认模式,其中的*相当于通配符,且默认模式不需要;;结束
二、使用for循环语句
1、适用场景:for循环适用于列表对象无规律,且列表来源已固定的场合
2、for语句的结构
for 变量名 in 取值列表
do
命令序列
done
三、使用while循环语句
1、适用场景:要求控制循环次数,操作对象按数字顺序编号,按特定条件执行重复操作的情况
2、while语句的结构
while 条件测试操作
do
命令序列
done
while有两个特殊条件测试操作:true和false,前者无限循环,后者不执行循环
四、until循环
1、格式与while相同,但until的判断条件与while相反
2、while true相当于until false
3、退出循环命令:break(退出循环)、continue(不执行后面的命令,直接到下一次循环)、exit 0\1(0为正常退出,1为异常退出)
五、Shell函数应用
1、函数:用来将一系列反复调用的命令序列按一定格式写在一起,以便重复使用
2、格式
[function] 函数名 (){
命令序列
[return x]
}
(1)[return x]为函数返回值,函数可以没有返回值
(2)调用函数直接输入函数名即可
六、Shell脚本调试
1、可在函数中加入echo命令来查看运行内容是否有错
2、sh [-nvx]命令
(1)-n:不执行脚本,仅检查语法是否正确,有错就给出错误提示
(2)-v:执行脚本时先将脚本内容输出到屏幕,如果有错,也会给出错误提示
(3)-x:将执行的脚本内容同步输出到屏幕,这是个对调试很有用的参数
七、练习题
1、猜数字游戏,用户输入1-100的整数,直到猜对结束
#!/bin/bash
#game
num=`expr $RANDOM % 100`
while true
do
read -p "请输入1-100的整数:" n
if [ $n -eq $num ]
then
echo "猜对啦!"
break
elif [ $n -lt $num ]
then
echo "猜小了"
else
echo "猜大了"
fi
done
2、99乘法表
#!/bin/bash
#9*9
i=1
x=0
a=""
while [ $i -le 9 ]
do
j=1
a=""
while [ $j -le $i ]
do
x=`expr $i \* $j`
b="$j*$i=$x"
a="$a $b"
let j++
done
echo "$a"
let i++
done
3、使用user.txt文件中的名单自动创建账户并设置初始密码
#!/bin/bash
#useradd
users=$(cat ./user.txt)
for name in $users
do
grep $name /etc/passwd &> /dev/null
if [ $? -eq 0 ]
then
echo "$name已存在!不予创建!"
continue
fi
useradd $name
echo "111111" | passwd --stdin $name
done
4、循环测试用户账户名和密码,最大测试3次,输入正确提示登录成功,否则提示登录失败(tom,123456)
#!/bin/bash
#user login
i=0
while true
do
read -p "请输入账号:" name
if [ $name = "tom" ]
then
read -p "请输入密码:" pass
if [ $pass = "123456" ]
then
echo "登录成功!"
break
else
echo "密码错误!"
fi
else
echo "账号错误!"
fi
let i++
if [ $i -eq 3 ]
then
echo "登录次数超过3次,断开连接!"
break
fi
done
5、关闭除自己以外的其他主机
#!/bin/bash
#killpts
if [ $# -eq 0 ]
then
echo "请输入本机IP"
else
i=$1
pts=`who | grep -v $1 | awk '{print $2}'`
for p in $pts
do
pkill -kill -t $p
done
fi
6、循环创建三位消息字母组合的字符到文本文件
#!/bin/bash
#creat txt
i=1
c=""
get () {
case $1 in
1)
c="a"
;;
2)
c="b"
;;
3)
c="c"
;;
4)
c="d"
;;
5)
c="e"
;;
6)
c="f"
;;
7)
c="g"
;;
8)
c="h"
;;
9)
c="i"
;;
10)
c="j"
;;
11)
c="k"
;;
12)
c="l"
;;
13)
c="m"
;;
14)
c="n"
;;
15)
c="o"
;;
16)
c="p"
;;
17)
c="q"
;;
18)
c="r"
;;
19)
c="s"
;;
20)
c="t"
;;
21)
c="u"
;;
22)
c="v"
;;
23)
c="w"
;;
24)
c="x"
;;
25)
c="y"
;;
26)
c="z"
;;
*)
echo $i
esac
}
i=1
a=""
ic=""
jc=""
xc=""
while [ $i -le 26 ]
do
j=1
get $i
a=$c
while [ $j -le 26 ]
do
x=1
get $j
jc=$a$c
while [ $x -le 26 ]
do
get $x
xc=$jc$c
echo $xc >> aaa-zzz
let x++
done
# echo $xc
let j++
done
# echo $a
let i++
done
7、判断用户输入数据类型(if和case都写一次)
#!/bin/bash
#chiose
read -p "请输入一个字符:" a
case $a in
[0-9])
echo "输入的为数字"
;;
[a-z]|[A-Z])
echo "输入的是字母"
;;
*)
echo "输入的是特殊字符"
esac
#!/bin/bash
#chiose2
read -p "请输入一个字符:" a
if [[ $a = [0-9] ]]
then
echo "输入的是一个数字"
elif [[ $a = [a-z] ]] || [[ $a = [A-Z] ]]
then
echo "输入的是一个字母"
else
echo "输入的是特殊字符"
fi
8、计算1+2+……100的值
#!/bin/bash
#1-100
i=0
a=0
while [ $i -le 100 ]
do
a=`expr $a + $i`
let i++
done
echo $a
9、批量添加用户
同第三题
10、批量删除用户
#!/bin/bash
#useradd
users=$(cat ./user.txt)
for name in $users
do
# uid=`grep aaa /etc/passwd | awk -F: '{print $3}'`
grep $name /etc/passwd &> /dev/null
if [ $? -eq 0 ] # && [ $uid -gt 500 ]
then
userdel -r $name
echo "$name已删除"
else
echo "$name不存在"
fi
done