Shell学习笔记(三):实战进阶篇

case结构条件句

case结构条件句语法

case "字符串变量" in
                值 1) 指令 1...
;;
                值 2) 指令 2...
;;
   *) 指令...
esac

case结构条件句范例

范例1:根据用户的输入判断式那个数字

s-31

拓展

让echo输出字符串显示不同颜色范例

开发一个给内容加颜色的函数

效果:

s-32

代码:

s-33

在脚本中给指定的内容加指定颜色:

s-34

要掌握的linux系统标杆脚本

/etc/init.d/functions
/etc/rc.d/rc/sysinit
/etc/init.d/nfs
/etc/init.d/portmap
/etc/init.d/httpd

当型循环和直到型循环

当型和直到型循环语法

1、while条件句

语法:

while 条件
                        do
                        指令...
done

2、until条件句

语法:

until 条件
                        do
                        指令...
done

提示:until应用场合不多,了解就好

例1:每隔2秒记录一次系统负载情况

法一:屏幕输出

s-35

提示:while true表示条件永远为真,因此会一直运行,像死循环一样,但是我们称呼为守护进程

法二:追加到log里,使用微秒单位

s-36

拓展知识

s-36

一些例子

1、计算1-100的和,用while

s-37

2、使用while循环竖向打印10,9,8...1

s-38

3、定时访问网站地址

s-39

提示:上面的方法可以用来测负载均衡是否平均分配到了节点

相关高级生产实战范例拓展

例1:根据http code status判断

s-40

引入函数库:

s-41

for循环结构

for循环结构语法

1、for循环结构语法

语法:

for 变量名 in 变量取值列表
do
                指令...
done

提示:在此结构中“in 变量取值列表”可省略。省略是相当于in "$@",使用for i就相当于使用for i in "$@"

for循环结构基础例子

例1:直接列出变量列表所有元素,打印5、4、3、2、1

法一:直接列出元素的方法

s-42

法二:使用大括号的方法

s-43

例2:获取当前目录下的目录名作为变量列表打印输出

s-44

例3:mysq分库分表备份的脚本

s-45

例4:

问题1:使用for循环在/yjscloud目录下批量创建10个文件,名称依次为:

yjs-1
yjs-2
yjs-3
......
yjs-10

问题2:将以上文件名中的yjs全部改为cloud。

问题3:批量创建10个系统账号yjs01-yjs10并设置密码(密码不能相同)

问题4:批量创建10个系统账号yjs01-yjs10并设置密码(密码为随机8位字符串)

参考答案:

问题1:

s-46

问题2:

s-47

问题3:

s-48

问题4:

s-49

linux系统产生随机数的6种方法

方法一:通过系统环境变量($RANDOM)

例:

[root@pan ~]# echo $RANDOM
2390
[root@pan ~]# echo $RANDOM
1527

方法二:通过openssl产生随机数

例:

[root@pan ~]# openssl rand -base64 8
ZXpVoQC9aLg=
[root@pan ~]# openssl rand -base64 10
3MWgyXj4Fp9RXQ==

方法三:通过时间获得随机数(date)

例:

[root@pan ~]# date +%s%N
1529673691945995626
[root@pan ~]# date +%s%N
1529673693875826576

方法四:
说明:/dev/random设备,存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候,
唯一值数据,因此可以作随机数元数据。我们可以通过文件读取方式,读得里面数据。/dev/urandom
这个设备数据与random里面一样。只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞。

例:

[root@pan ~]# head /dev/urandom|cksum
1250884990 2522
[root@pan ~]# head /dev/urandom|cksum
2562355899 2759

方法五:

说明:UUID码全称是通用唯一识别码,它是一个软件构建的标准,亦为自由软件基金会的
组织在分布式计算环境领域的一部分。UUID的目的,是让分布式系统中的所有元素,都能有唯一
的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它
人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题,它会让网络任何一台计算机所生成的uuid码都是互联网整个服务器网络中唯一的。它的原信息会加入硬件时间,机器当前运行信息等等。UUID格式是:包含32个16进位数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。

例:

[root@pan ~]# cat /proc/sys/kernel/random/uuid
6fd25695-a798-49b0-b88f-ccb6f010e949
[root@pan ~]# cat /proc/sys/kernel/random/uuid
746c7ad0-4979-4a04-b830-347bdcb3b668

方法六:

例:

[root@pan ~]# yum -y install expect -y
[root@pan ~]# mkpasswd -l 8
ckxCX69>
[root@pan ~]# mkpasswd -l 8
DhqK9/z7

上面的随机数长短不一,如何统一格式化呢?答:使用md5sum命令

例1:

[root@pan ~]# cat /proc/sys/kernel/random/uuid|md5sum|cut -c 1-9
b555bce24
[root@pan ~]# head /dev/urandom|cksum|md5sum|cut -c 1-9
9dfc35416
[root@pan ~]# date +%s%N|md5sum|cut -c 1-9
364503a1a
[root@pan ~]# openssl rand -base64 10|md5sum|cut -c 1-9
1b9639d90

例2:使用for循环测试随机数的唯一性

[root@pan ~]# for n in `seq 10`;do echo $RANDOM|md5sum|cut -c 1-9;done|sort|uniq -c|sort -rn -k1
      1 fed42f93b
      1 f0eb3e614
      1 d4f8e0b04
      1 c080f8c02
      1 8ca398e3a
      1 891321fee
      1 60db6c5bf
      1 31788d2ff
      1 30b296200
      1 2196b3a04
[root@pan ~]# for n in `seq 10`;do echo date +%s%N|md5sum|cut -c 1-9;done|sort|uniq -c|sort -rn -k1
     10 aa7d1a548

企业面试题:

写一个脚本,实现判断172.16.149.0/24网络里,当前在线用户的ip有哪些

s-50

select循环语句介绍及语法

select循环语句的主要作用可能就是创建菜单,在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。
语法结构:

select 变量名 [ in 菜单取值列表 ]
do
                指令...
done

select循环语句案例

例1:用select循环打印简单菜单项的多种实现方法

方法一:直接使用列表字符串

s-51

[root@pan shell]# sh select01.sh
1) xwq
2) xdf
3) yjs
#? 1
xwq
#? 2
xdf
#? 3
yjs
#? hzw   输入错误,返回空。

方法二:采用数组做变量列表

s-52

方法三:把命令结果作为变量列表(菜单项)

1)数据准备

[root@pan shell]# mkdir -p /tmp/test
[root@pan shell]# mkdir -p /tmp/test/{xwq,xdf,yjs}
[root@pan shell]# ls -l /tmp/test/
total 0
drwxr-xr-x 2 root root 6 Jun 22 22:40 xdf
drwxr-xr-x 2 root root 6 Jun 22 22:40 xwq
drwxr-xr-x 2 root root 6 Jun 22 22:40 yjs

2)开发脚本

s-53

3)执行结果

[root@pan shell]# sh select03.sh
1) xdf
2) xwq
3) yjs
#?

修改select默认提示符

例1:调整select循环菜单项的默认提示符及利用select变量打印数字序号。

s-54

提示:PS3就是控制select循环的提示符,REPLY变量就是菜单项对应的数字。

执行演示:

[root@pan shell]# sh select04.sh
1) xwq
2) xdf
3) yjs
please select a num from menu:1
I guess you selected the menu is:
1) xwq
please select a num from menu:2
I guess you selected the menu is:
2) xdf
please select a num from menu:3
I guess you selected the menu is:
3) yjs
please select a num from menu:^C

例2:打印选择菜单,按照选择一键安装不同的web服务。

要求:

1)当用户输入1时,输出”start installing lamp.“然后执行/server/scripts/lamp.sh
脚本内容输出”lamp is installed“后退出脚本

2)当用户输入2时,输出”start installing lnmp“然后执行/server/scripts/lnmp.sh
脚本输出内容”lamp is installed“后退出脚本

3)当输入3时,退出当前菜单脚本;

4)当输入任何其他字符,给出提示”input error“后退出脚本。

5)要对执行的脚本进行相关条件判读,例如:脚本是否存在,是否可执行等。

#!/bin/sh
RETVAR=0
path=/server/scripts                                #定义脚本路径
[ ! -d "$path" ] && mkdir $path -p                #如果路径不存在,就创建
function Usage(){                                #定义帮助函数
        echo "Usage:$0 argv"
        return 1
}
function InstallService(){                        #定义安装服务函数
        if [ $# -ne 1 ];then                        #参数不等于1,就打印帮助
                Usage
        fi
        local RETVAR=0                                #初始化返回值
        echo "start installing ${1}"                #打印开始安装服务,传参$1,$1是函数的参数,本例即lamp或lnmp
        sleep 2;
        if [ ! -x "$path/${1}.sh" ];then        #如果安装服务脚本不可执行,则给出提示后退出。
                echo "$path/${1}.sh does not exist or can not be exec"
                return 1
        else
                $path/${1}.sh                        #执行脚本       
                return $RETVAR                        #返回值返回函数体外
        fi
}
function main(){                                #主函数
        PS3="`echo pls input the num you want:`"        #菜单提示
        select var in "Install lamp" "Install lnmp" "exit"
        #select循环,菜单内容列表,列表中有空格就要加引号
        do
                case "$REPLY" in                #使用获取select循环对应的数字序列的环境变量
                        1)                        #如果匹配1,则执行下面的指令,到双分号结束
                                InstallService lamp
                                RETVAR=$?
                                ;;
                        2)                        #如果匹配2,则执行下面的指令,到双分号结束
                                InstallService lnmp
                                RETVAR=$?
                                ;;
                        3)                        #如果匹配3,则执行下面的指令,到双分号结束
                                echo bye
                                return 3
                                ;;
                        *)
                                echo "the num you input must be {1|2|3}"
                                echo "Input ERROR"
                esac
        done
exit $ RETVAR
}
main

执行结果:

s-55

|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/77
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
Shell学习笔记(三):实战进阶篇
case结构条件句 case结构条件句语法 case "字符串变量" in 值 1) 指令 1... ;; 值 2) 指令 2... ;; *) 指令...……
<<上一篇
下一篇>>
文章目录
关闭
目 录