Shell制作随机数和嵌套循环
发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,这篇文章主要为大家详细介绍了Shell制作随机数和嵌套循环的方法,文中示例代码介绍的非常详细,零基础也能参考此文章,感兴趣的小伙伴们可以参考一下。一、随机数1. 如何生成随机数?系统变量:RANDOM
千家信息网最后更新 2024年12月04日Shell制作随机数和嵌套循环
这篇文章主要为大家详细介绍了Shell制作随机数和嵌套循环的方法,文中示例代码介绍的非常详细,零基础也能参考此文章,感兴趣的小伙伴们可以参考一下。
一、随机数
1. 如何生成随机数?
系统变量:RANDOM,默认会产生0~32767的随机整数
前言:要想调用变量,不管你是什么变量都要给钱,而且是美元:heavy_dollar_sign:
打印一个随机数echo $RANDOM查看系统上一次生成的随机数# set|grep RANDOMRANDOM=28325产生0~1之间的随机数echo $[$RANDOM%2]产生0~2之间的随机数echo $[$RANDOM%3]产生0~3之间的随机数echo $[$RANDOM%4]产生0~9内的随机数echo $[$RANDOM]产生0~100内的随机数echo $[$RANDOM1]产生50-100之内的随机数echo $[$RANDOM%51+50]产生三位数的随机数echo $[$RANDOM%900+100]
2. 实战案例
1)随机产生以139开头的电话号码
具体需求1:
写一个脚本,产生一个phonenum.txt文件,随机产生以139开头的手机号1000个,每个一行。
① 思路
- 产生1000个电话号码,脚本需要循环1000次
FOR WHILE UNTIL
- 139+8位,后8位随机产生,可以让每一位数字都随机产生
echo $[$RANDOM]
- 将随机产生的数字分别保存到变量里,然后加上139保存到文件里
② 落地实现
#!/bin/env bash#产生1000个以139开头的电话号码并保存文件phonenum.txtfile=/shell03/phonenum.txtfor ((i=1;i<=1000;i++))do n1=$[$RANDOM] n2=$[$RANDOM] n3=$[$RANDOM] n4=$[$RANDOM] n5=$[$RANDOM] n6=$[$RANDOM] n7=$[$RANDOM] n8=$[$RANDOM] echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> $filedone#!/bin/bash# random phonenum# 循环1000次产生电话号码并保存到文件for i in {1..1000}do n1=$[RANDOM] n2=$[RANDOM] n3=$[RANDOM] n4=$[RANDOM] n5=$[RANDOM] n6=$[RANDOM] n7=$[RANDOM] n8=$[RANDOM] echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txtdone#!/bin/bashi=1while [ $i -le 1000 ]do n1=$[$RANDOM] n2=$[$RANDOM] n3=$[$RANDOM] n4=$[$RANDOM] n5=$[$RANDOM] n6=$[$RANDOM] n7=$[$RANDOM] n8=$[$RANDOM] echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt let i++donecontinue:继续,跳过本次循环,执行下一次循环break:打断,执行循环体外的代码do..done外exit:退出程序#!/bin/bashfor i in {1..1000}do n1=$[$RANDOM] n2=$[$RANDOM] n3=$[$RANDOM] n4=$[$RANDOM] n5=$[$RANDOM] n6=$[$RANDOM] n7=$[$RANDOM] n8=$[$RANDOM] echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txtdone#!/bin/bash#create phone num filefor ((i=1;i<=1000;i++))do n1=$[$RANDOM] n2=$[$RANDOM] n3=$[$RANDOM] n4=$[$RANDOM] n5=$[$RANDOM] n6=$[$RANDOM] n7=$[$RANDOM] n8=$[$RANDOM] echo "139$n1$n2$n3$n4$n5$n6$n7$n8" |tee -a phonenum.txtdone#!/bin/bashcount=0while truedo n1=$[$RANDOM] n2=$[$RANDOM] n3=$[$RANDOM] n4=$[$RANDOM] n5=$[$RANDOM] n6=$[$RANDOM] n7=$[$RANDOM] n8=$[$RANDOM] echo "139$n1$n2$n3$n4$n5$n6$n7$n8" |tee -a phonenum.txt && let count++ if [ $count -eq 1000 ];then break fidone
2)随机抽出5位幸运观众
具体需求:
- 在上面的1000个手机号里抽奖==5个==幸运观众,显示出这5个幸运观众。
- 但只显示头3个数和尾号的4个数,中间的都用*代替
① 思路
- 确定幸运观众所在的行
0-1000 随机找出一个数字 $[$RANDOM00+1]
- 将电话号码提取出来
head -随机产生行号 phonenum.txt |tail -1
- ==显示==前3个和后4个数到屏幕
echo 139****
② 落地实现
#!/bin/bash#定义变量phone=/shell03/phonenum.txt#循环抽出5位幸运观众for ((i=1;i<=5;i++))do #定位幸运观众所在行号 line=`wc -l $phone |cut -d' ' -f1` luck_line=$[RANDOM%$line+1] #取出幸运观众所在行的电话号码 luck_num=`head -$luck_line $phone|tail -1` #显示到屏幕 echo "139****${luck_num:7:4}" echo $luck_num >> luck.txt #删除已经被抽取的幸运观众号码 #sed -i "/$luck_num/d" $phonedone#!/bin/bashfile=/shell04/phonenum.txtfor i in {1..5}do file_num=`wc -l $file |cut -d' ' -f1` line=`echo $[$RANDOM%$file_num+1]` luck=`head -n $line $file|tail -1` echo "139****${luck:7:4}" && echo $luck >> /shell04/luck_num.txtdone#!/bin/bashfor ((i=1;i<=5;i++))dofile=phonenum.txtline=`cat phonenum.txt |wc -l` 1000luckline=$[$RANDOM%$line+1]phone=`cat $file|head -$luckline|tail -1`echo "幸运观众为:139****${phone:7:4}"done或者#!/bin/bash# choujiangphone=phonenum.txtfor ((i=1;i<=5;i++))do num=`wc -l phonenum.txt |cut -d' ' -f1` line=`echo $[$RANDOM%$num+1]` luck=`head -$line $phone |tail -1` sed -i "/$luck/d" $phone echo "幸运观众是:139****${luck:7:4}"done
3)批量创建用户(密码随机产生)
需求:批量创建5个用户,每个用户的密码为一个随机数
① 思路
- 循环5次创建用户
- 产生一个密码文件来保存用户的随机密码
- 从密码文件中取出随机密码赋值给用户
② 落地实现
#!/bin/bash#crate user and set passwd#产生一个保存用户名和密码的文件echo user0{1..5}:itcast$[$RANDOM%9000+1000]#@~|tr ' ' '\n'>> user_pass.file#循环创建5个用户for ((i=1;i<=5;i++))do user=`head -$i user_pass.file|tail -1|cut -d: -f1` pass=`head -$i user_pass.file|tail -1|cut -d: -f2` useradd $user echo $pass|passwd --stdin $userdone或者for i in `cat user_pass.file`do user=`echo $i|cut -d: -f1` pass=`echo $i|cut -d: -f2` useradd $user echo $pass|passwd --stdin $userdone#!/bin/bash#crate user and set passwd#产生一个保存用户名和密码的文件echo user0{1..3}:itcast$[$RANDOM%9000+1000]#@~|tr ' ' '\n'|tr ':' ' ' >> user_pass.file#循环创建5个用户while read user passdouseradd $userecho $pass|passwd --stdin $userdone < user_pass.filepwgen工具产生随机密码:[root@server shell04]# pwgen -cn1 12Meep5ob1aesa[root@server shell04]# echo user0{1..3}:$(pwgen -cn1 12)user01:Bahqu9haipho user02:Feiphoh7moo4 user03:eilahj5eth3R[root@server shell04]# echo user0{1..3}:$(pwgen -cn1 12)|tr ' ' '\n'user01:eiwaShuZo5hiuser02:eiDeih7aim9kuser03:aeBahwien8co
二、嵌套循环
关键字:大圈套小圈
:clock3:时钟:分针与秒针,秒针转⼀圈(60格),分针转1格。循环嵌套就是外层循环⼀次,内层循环⼀轮。
- 一个==循环体==内又包含另一个完整的循环结构,称为循环的嵌套。
- 每次外部循环都会==触发==内部循环,直至内部循环完成,才接着执行下一次的外部循环。
- for循环、while循环和until循环可以相互嵌套。
1. 应用案例
1)打印指定图案
112123123412345554543543254321
2)落地实现1
X轴:for ((i=1;i<=5;i++));do echo -n $i;doneY轴:负责打印换行#!/bin/bashfor ((y=1;y<=5;y++))do for ((x=1;x<=$y;x++)) do echo -n $x doneechodone#!/bin/bashfor ((y=1;y<=5;y++))do x=1 while [ $x -le $y ] do echo -n $x let x++ doneechodone
3)落地实现2
Y轴:打印换行X轴:打印数字 5-1#!/bin/bashy=5while (( $y >= 1 ))do for ((x=5;x>=$y;x--)) do echo -n $x doneecholet y--done#!/bin/bashfor (( y=5;y>=1;y--))do for (( x=5;x>=$y;x--)) do echo -n $x doneechodone#!/bin/bashy=5while [ $y -ge 1 ]do for ((x=5;x>=$y;x--)) do echo -n $x doneecholet y--done#!/bin/bashy=1until (( $y >5 ))do x=1 while (( $x <= $y )) do echo -n $[6-$x] let x++ done echolet y++done课后打印:543215432543545
##2. 课堂练习
打印九九乘法表(三种方法)
1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81Y轴:循环9次,打印9行空行X轴:循环次数和Y轴相关;打印的是X和Y轴乘积 $[] $(())#!/bin/bashfor ((y=1;y<=9;y++))do for ((x=1;x<=$y;x++)) do echo -ne "$x*$y=$[$x*$y]\t" doneechoechodone#!/bin/bashy=1while [ $y -le 9 ]do x=1 while [ $x -le $y ] do echo -ne "$x*$y=$[$x*$y]\t" let x++ doneechoecholet y++done或者#!/bin/bashfor i in `seq 9`do for j in `seq $i` do echo -ne "$j*$i=$[$i*$j]\t" doneechoechodone或者#!/bin/bashy=1until [ $y -gt 9 ]do x=1 until [ $x -gt $y ] do echo -ne "$x*$y=$[ $x*$y ]\t" let x++ doneechoecholet y++done
三、阶段性补充总结
1. 影响shell程序的内置命令
exit 退出整个程序break 结束当前循环,或跳出本层循环continue 忽略本次循环剩余的代码,直接进行下一次循环shift 使位置参数向左移动,默认移动1位,可以使用shift 2:truefalse
举例说明:
以下脚本都能够实现用户自定义输入数字,然后脚本计算和:[root@MissHou shell04]# cat shift.sh #!/bin/bashsum=0while [ $# -ne 0 ]dolet sum=$sum+$1shiftdoneecho sum=$sum[root@MissHou shell04]# cat for3.sh #!/bin/bashsum=0for idolet sum=$sum+$idoneecho sum=$sum
##4. 补充扩展expect
expect 自动应答 tcl语言
需求1:A远程登录到server上什么都不做
#!/usr/bin/expect# 开启一个程序spawn ssh root@10.1.1.1# 捕获相关内容expect { "(yes/no)?" { send "yes\r";exp_continue } "password:" { send "123456\r" }}interact //交互脚本执行方式:# ./expect1.sh# /shell04/expect1.sh# expect -f expect1.sh1)定义变量#!/usr/bin/expectset ip 10.1.1.2set pass 123456set timeout 5spawn ssh root@$ipexpect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" }}interact2)使用位置参数#!/usr/bin/expectset ip [ lindex $argv 0 ]set pass [ lindex $argv 1 ]set timeout 5spawn ssh root@$ipexpect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" }}interact
需求2:A远程登录到server上操作
#!/usr/bin/expectset ip 10.1.1.1set pass 123456set timeout 5spawn ssh root@$ipexpect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" }}expect "#"send "rm -rf /tmp/*\r"send "touch /tmp/file{1..3}\r"send "date\r"send "exit\r"expect eof
需求3:shell脚本和expect结合使用,在多台服务器上创建1个用户
[root@server shell04]# cat ip.txt 10.1.1.1 12345610.1.1.2 1234561. 循环2. 登录远程主机-->ssh-->从ip.txt文件里获取IP和密码分别赋值给两个变量3. 使用expect程序来解决交互问题#!/bin/bash# 循环在指定的服务器上创建用户和文件while read ip passdo /usr/bin/expect <<-END &>/dev/null spawn ssh root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect "#" { send "useradd yy1;rm -rf /tmp/*;exit\r" } expect eof ENDdone < ip.txt#!/bin/bashcat ip.txt|while read ip passdo { /usr/bin/expect <<-HOU spawn ssh root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect "#" send "hostname\r" send "exit\r" expect eof HOU }&donewaitecho "user is ok...."或者#!/bin/bashwhile read ip passdo { /usr/bin/expect <<-HOU spawn ssh root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect "#" send "hostname\r" send "exit\r" expect eof HOU }&done
四、综合案例
1. 实战案例1
1)具体需求
写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上
说明:主机和密码文件已经提供
10.1.1.1:123456
10.1.1.2:123456
2)案例分析
- 关闭防火墙和selinux
- 判断ssh服务是否开启(默认ok)
- ==循环判断给定密码文件里的哪些IP是可以ping通==
- ==判断IP是否可以ping通-->$?->流程控制语句==
- ==密码文件里获取主机的IP和密码保存变量==
- ==判断公钥是否存在->不存在创建它==
- ==ssh-copy-id 将跳板机上的yunwei用户的公钥推送到远程主机->expect解决交互==
- ==将ping通的主机IP单独保存到一个文件==
- ==测试验证==
3)落地实现
① 代码拆分
1.判断yunwei用户的公钥是否存在[ ! -f /hoem/yunwei/.ssh/id_rsa ] && ssh-keygen -P '' -f ./id_rsa2.获取IP并且判断是否可以ping通1)主机密码文件ip.txt 10.1.1.1:123456 10.1.1.2:1234562) 循环判断主机是否ping通 tr ':' ' ' < ip.txt|while read ip pass do ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then 推送公钥 fi done3.非交互式推送公钥/usr/bin/expect <<-END &>/dev/null spawn ssh-copy-id root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect eof END
② 最终实现
- 环境准备
jumper-server 有yunwei用户yunwei用户sudo授权:visudo## Allow root to run any commands anywhereroot ALL=(ALL) ALLyunwei ALL=(root) NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm -rf /解释说明:1)第一个字段yunwei指定的是用户:可以是用户名,也可以是别名。每个用户设置一行,多个用户设置多行,也可以将多个用户设置成一个别名后再进行设置。2)第二个字段ALL指定的是用户所在的主机:可以是ip,也可以是主机名,表示该sudo设置只在该主机上生效,ALL表示在所有主机上都生效!限制的一般都是本机,也就是限制使用这个文件的主机;一般都指定为"ALL"表示所有的主机,不管文件拷到那里都可以用。比如:10.1.1.1=...则表示只在当前主机生效。3)第三个字段(root)括号里指定的也是用户:指定以什么用户身份执行sudo,即使用sudo后可以享有所有root账号下的权限。如果要排除个别用户,可以在括号内设置,比如ALL=(ALL,!oracle,!pos)。4)第四个字段ALL指定的是执行的命令:即使用sudo后可以执行所有的命令。除了关机和删除根内容以外;也可以设置别名。NOPASSWD: ALL表示使用sudo的不需要输入密码。5)也可以授权给一个用户组 %admin ALL=(ALL) ALL 表示admin组里的所有成员可以在任何主机上以任何用户身份执行任何命令
- 脚本实现
#!/bin/bash#判断公钥是否存在[ ! -f /home/yunwei/.ssh/id_rsa ] && ssh-keygen -P '' -f ~/.ssh/id_rsa#循环判断主机是否ping通,如果ping通推送公钥tr ':' ' ' < /shell04/ip.txt|while read ip passdo{ ping -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo $ip >> ~/ip_up.txt /usr/bin/expect <<-END &>/dev/null spawn ssh-copy-id root@$ip expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$pass\r" } } expect eof END fi}&donewaitecho "公钥已经推送完毕,正在测试...."#测试验证remote_ip=`tail -1 ~/ip_up.txt`ssh root@$remote_ip hostname &>/dev/nulltest $? -eq 0 && echo "公钥成功推送完毕"
2. 实战案例2
写一个脚本,统计web服务的不同==连接状态==个数
#!/bin/bash#count_http_80_state#统计每个状态的个数declare -A array1states=`ss -ant|grep 80|cut -d' ' -f1`for i in $statesdo let array1[$i]++done#通过遍历数组里的索引和元素打印出来for j in ${!array1[@]}do echo $j:${array1[$j]}done
以上就是Shell制作随机数和嵌套循环的方法介绍,详细使用情况还需要大家自己亲自动手使用过才能领会。如果想了解更多相关内容,欢迎关注行业资讯频道!
循环
用户
文件
主机
密码
随机数
公钥
脚本
幸运
变量
观众
需求
号码
案例
落地
个数
数字
电话
电话号码
程序
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术人员kpi
泰拉瑞亚手游服务器端口
国家网络安全最新要求
龙成云财会软件开发有限公司
qq游戏安装数据库
上海迈货网网络技术有限公司
广州商城软件开发电话
计算机网络安全论文标题
退出mysql数据库
软件开发行业发展和就业
赴日软件开发工程师招聘
扫描枪导入excel数据库
服务器安全
2万元联想服务器跑分
网络安全保密工作培训材料
软件开发中节能
计算机网络技术论文怎么引用
吉林放心软件开发参考价格
可以安装苹果的虚拟服务器
谁家的香港服务器好
聊天交友软件开发
服务器危险命令
杭州支付宝网络技术公司招聘
软件开发项目总结模版
网络技术2016序列号
go服务器编程
数据库修改视图代码添加
金财网络技术有限公司
网络技术专业女生岗位
网络安全模式启动系统