示例4:生成8位随机密码(使用字符串分片的方法)
实验要求:生成8位随机密码,密码范围为26个大小写英文字母和10个阿拉伯数字。
实验思路:
- 先定义密码取值范围:26个大小写英文字母和10个阿拉伯数字
- 每次取1个字符。
- 循环取8次。
实验步骤:
1、字符串分片(截取字符串)
#获取字符串长度 ${#变量名} #字符串下标值 字符串内下标值从0开始,0到字符串长度减1。 如果字符串长度为8,那么下标值就是 0到7。 #截取字符串 ${变量名:开始的下标值:截取长度} #字符串追加 变量一+=变量二 # 示例: i="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 字符串长度:${#i} //此时长度为62 字符串下标值:0-61 截取第一个字符:${i:0:1} 截取前三个字符:${i:0:3} 截取最后一个字符:${i:61:1} 复制代码
2、生成随机数
#变量RANDOM的取值范围是:0-32767 #生成 0-61 之间的随机数 $[RANDOM % 62] #生成符串长度以内的随机数(即 0-字符串长度减1) $[RANDOM % ${#i}] #随机截取字符串内任意一个字符 num=$[RANDOM % ${#i}] //生成字符串长度以内的随机数 var=${i:$num:1} //随机截取字符串内任意一个字符 复制代码
3、示例代码
[root@yuji ~]# vim passran.sh #!/bin/bash # 要求生成8位随机密码,密码范围为26个大小写英文字母和10个阿拉伯数字。 # --------------------- #定义密码取值范围 string="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" #循环8次 for i in {1..8} do #每次循环随机获取0到字符串长度减1的下标值 num=$[RANDOM % ${#string}] #进行字符串截取,每次随机取出1个字符 var=${string:$num:1} #每次追加生成的密码,passwd+=$var等同于passwd=$passwd$var passwd+=$var done echo "本次生成的密码为:$passwd" 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
3 多线程执行脚本(并行执行)
普通for循环是串行,一个一个执行。
在do和done中间增加 { } 符号,可以多线程同时执行。
多线程案例演示:
- ping 192.168.72.0/24网段内的所有主机。
[root@yuji ~]# vim for4.sh #!/bin/bash #多线程,同时ping多台主机 for ip in 192.168.72.{1..254} do { ping -c3 -w2 $ip &>/dev/null if [ $? -eq 0 ] then echo "$ip is up" >> /opt/up.txt else echo "$ip is down" >> /opt/down.txt fi }& #{ }表示多线程同时执行 #增加 & 符号,表示将进程放到后台运行,后台命令之间是不区分 先来后到关系的 done #wait的作用是等待上面所有后台进程都执行完毕后,才会去执行后 面的语句。如果没有wait,后面的语句是不会等待后台进程的,会>造成一些需要有上下文关系的程序执行错误。 wait cat /opt/up.txt cat /opt/down.txt 复制代码
网络异常,图片无法展示
|
4 for的三个默认分隔符
环境变量$IFS,是指内部字段分隔符, 默认为三个:空格、制表符 \t、换行符 \n。
使用set命令查看所有变量:
网络异常,图片无法展示
|
4.1 分隔符的作用演示:
示例:使用for读取文件内容,文件中有空格
演示:
文件中只有3行内容,使用for语句读取却显示为5行。
[root@yuji sh]# vim fen1.sh //写脚本 #!/bin/bash #从文件中获取变量值,$()表示调用命令执行的结果 for name in $(cat name.txt) do echo "$name" done [root@yuji sh]# cat name.txt //查看文件内容,只有3行 zhang san lisi wang wu [root@yuji sh]# bash fen1.sh //运行脚本,显示5行内容 zhang san lisi wang wu 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
原因:
变量IFS定义的分隔符中有空格,for从文件中获取变量值时,以空格作为了分隔符,将"zhang san"分隔成了两行,"wang wu"也是如此。
解决方法:
在脚本中,先临时将变量IFS的值中的空格删除,使for语句不以空格作为分隔符,最后还原变量值。
[root@yuji sh]# vim fen2.sh //写脚本 #!/bin/bash #借用一个临时变量先保存IFS的原始值 IFS_OLD=$IFS #删除空格和制表符,只保留换行符作为分隔符 IFS=$'\n' #从文件中获取变量值,$()表示调用命令执行的结果 for name in $(cat name.txt) do echo "$name" done #还原变量IFS的原始值 IFS=$IFS_OLD [root@yuji sh]# cat name.txt //查看文件内容,只有3行 zhang san lisi wang wu [root@yuji sh]# bash fen2.sh //运行脚本,显示3行 zhang san lisi wang wu 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|