Linux网络服务与shell脚本——Shell编程之case语句与循环语句

                    第九章 Shell编程之case语句与循环语句

一、使用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
发布了40 篇原创文章 · 获赞 15 · 访问量 3478

猜你喜欢

转载自blog.csdn.net/lkolkolkol/article/details/103706607