Shell学习笔记(三):实战进阶篇
case结构条件句
case结构条件句语法
case "字符串变量" in
值 1) 指令 1...
;;
值 2) 指令 2...
;;
*) 指令...
esac
case结构条件句范例
范例1:根据用户的输入判断式那个数字
拓展
让echo输出字符串显示不同颜色范例
开发一个给内容加颜色的函数
效果:
代码:
在脚本中给指定的内容加指定颜色:
要掌握的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秒记录一次系统负载情况
法一:屏幕输出
提示:while true表示条件永远为真,因此会一直运行,像死循环一样,但是我们称呼为守护进程
法二:追加到log里,使用微秒单位
拓展知识
一些例子
1、计算1-100的和,用while
2、使用while循环竖向打印10,9,8...1
3、定时访问网站地址
提示:上面的方法可以用来测负载均衡是否平均分配到了节点
相关高级生产实战范例拓展
例1:根据http code status判断
引入函数库:
for循环结构
for循环结构语法
1、for循环结构语法
语法:
for 变量名 in 变量取值列表
do
指令...
done
提示:在此结构中“in 变量取值列表”
可省略。省略是相当于in "$@"
,使用for i
就相当于使用for i in "$@"
for循环结构基础例子
例1:直接列出变量列表所有元素,打印5、4、3、2、1
法一:直接列出元素的方法
法二:使用大括号的方法
例2:获取当前目录下的目录名作为变量列表打印输出
例3:mysq分库分表备份的脚本
例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:
问题2:
问题3:
问题4:
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有哪些
select循环语句介绍及语法
select循环语句的主要作用可能就是创建菜单,在执行带select循环语句的脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符(默认是#?),同时等待用户输入数字进行选择。
语法结构:
select 变量名 [ in 菜单取值列表 ]
do
指令...
done
select循环语句案例
例1:用select循环打印简单菜单项的多种实现方法
方法一:直接使用列表字符串
[root@pan shell]# sh select01.sh
1) xwq
2) xdf
3) yjs
#? 1
xwq
#? 2
xdf
#? 3
yjs
#? hzw 输入错误,返回空。
方法二:采用数组做变量列表
方法三:把命令结果作为变量列表(菜单项)
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)开发脚本
3)执行结果
[root@pan shell]# sh select03.sh
1) xdf
2) xwq
3) yjs
#?
修改select默认提示符
例1:调整select循环菜单项的默认提示符及利用select变量打印数字序号。
提示: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
执行结果:
作者:废权
链接:https://blog.yjscloud.com/archives/77
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。


共有 0 条评论