标签搜索

目 录CONTENT

文章目录

shell编程之随机数和嵌套循环.md

小小城
2021-08-22 / 0 评论 / 0 点赞 / 3 阅读 / 6,909 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

shell编程之随机数和嵌套循环

@[toc]

一、随机数

关键词:一切都是未知数,永远不知道明天会抽什么风🎐😅

1. 如何生成随机数?

系统变量:RANDOM,默认会产生0~32767的随机整数
前言:要想调用变量,不管你是什么变量都要给钱,而且是美元💲

打印一个随机数
echo $RANDOM

查看系统上一次生成的随机数
# set|grep RANDOM
RANDOM=28325

产生0~1之间的随机数
echo $[$RANDOM%2]

产生0~2之间的随机数
echo $[$RANDOM%3]

产生0~3之间的随机数
echo $[$RANDOM%4]

产生0~9内的随机数
echo $[$RANDOM%10]

产生0~100内的随机数
echo $[$RANDOM%101]

产生50-100之内的随机数
echo $[$RANDOM%51+50]

产生三位数的随机数
echo $[$RANDOM%900+100]

2. 实战案例

㈠ 随机产生以139开头的电话号码
具体需求1:
写一个脚本,产生一个phonenum.txt文件,随机产生以139开头的手机号1000个,每个一行。
① 思路

  1. 产生1000个电话号码,脚本需要循环1000次 FOR WHILE UNTIL
  2. 139+8位,后8位随机产生,可以让每一位数字都随机产生 echo $[$RANDOM%10]
  3. 将随机产生的数字分别保存到变量里,然后加上139保存到文件里

② 落地实现

#!/bin/env bash
#产生1000个以139开头的电话号码并保存文件phonenum.txt
file=/shell03/phonenum.txt

for ((i=1;i<=1000;i++))
	do
		n1=$[$RANDOM%10]
		n2=$[$RANDOM%10]
		n3=$[$RANDOM%10]
		n4=$[$RANDOM%10]
		n5=$[$RANDOM%10]
		n6=$[$RANDOM%10]
		n7=$[$RANDOM%10]
		n8=$[$RANDOM%10]
		echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> $file
	done

#!/bin/bash
# random phonenum
# 循环1000次产生电话号码并保存到文件
for i in {1..1000}
	do
		n1=$[RANDOM%10]
		n2=$[RANDOM%10]
		n3=$[RANDOM%10]
		n4=$[RANDOM%10]
		n5=$[RANDOM%10]
		n6=$[RANDOM%10]
		n7=$[RANDOM%10]
		n8=$[RANDOM%10]
		echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt
	done


#!/bin/bash
i=1
while [ $i -le 1000 ]
	do
		n1=$[$RANDOM%10]
		n2=$[$RANDOM%10]
		n3=$[$RANDOM%10]
		n4=$[$RANDOM%10]
		n5=$[$RANDOM%10]
		n6=$[$RANDOM%10]
		n7=$[$RANDOM%10]
		n8=$[$RANDOM%10]
		echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt
		let i++
	done

continue:继续,跳过本次循环,执行下一次循环
break:打断,执行循环体外的代码do..done外
exit:退出程序

#!/bin/bash
for i in {1..1000}
	do
		n1=$[$RANDOM%10]
		n2=$[$RANDOM%10]
		n3=$[$RANDOM%10]
		n4=$[$RANDOM%10]
		n5=$[$RANDOM%10]
		n6=$[$RANDOM%10]
		n7=$[$RANDOM%10]
		n8=$[$RANDOM%10]
		echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt
	done


#!/bin/bash
#create phone num file
for ((i=1;i<=1000;i++))
	do
		n1=$[$RANDOM%10]
		n2=$[$RANDOM%10]
		n3=$[$RANDOM%10]
		n4=$[$RANDOM%10]
		n5=$[$RANDOM%10]
		n6=$[$RANDOM%10]
		n7=$[$RANDOM%10]
		n8=$[$RANDOM%10]
		echo "139$n1$n2$n3$n4$n5$n6$n7$n8" |tee -a phonenum.txt
	done


#!/bin/bash
count=0
while true
	do
		n1=$[$RANDOM%10]
		n2=$[$RANDOM%10]
		n3=$[$RANDOM%10]
		n4=$[$RANDOM%10]
		n5=$[$RANDOM%10]
		n6=$[$RANDOM%10]
		n7=$[$RANDOM%10]
		n8=$[$RANDOM%10]
		echo "139$n1$n2$n3$n4$n5$n6$n7$n8" |tee -a phonenum.txt && let
															count++
		if [ $count -eq 1000 ];then
			break
		fi
	done

㈡ 随机抽出5位幸运观众
具体需求:

  1. 在上面的1000个手机号里抽奖5个幸运观众,显示出这5个幸运观众。
  2. 但只显示头3个数和尾号的4个数,中间的都用*代替

① 思路

  1. 确定幸运观众所在的行 0-1000 随机找出一个数字 $[$RANDOM%1000+1]
  2. 将电话号码提取出来 head -随机产生行号 phonenum.txt |tail -1
  3. 显示前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" $phone
	done


#!/bin/bash
file=/shell04/phonenum.txt
for 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.txt
	done


#!/bin/bash
for ((i=1;i<=5;i++))
	do
		file=phonenum.txt
		line=`cat phonenum.txt |wc -l` 1000
		luckline=$[$RANDOM%$line+1]
		phone=`cat $file|head -$luckline|tail -1`
		echo "幸运观众为:139****${phone:7:4}"
	done


或者
#!/bin/bash
# choujiang
phone=phonenum.txt
for ((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

㈢ 批量创建用户(密码随机产生)
需求:批量创建5个用户,每个用户的密码为一个随机数
① 思路

  1. 循环5次创建用户
  2. 产生一个密码文件来保存用户的随机密码
  3. 从密码文件中取出随机密码赋值给用户

② 落地实现

#!/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 $user
	done
或者
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 $user
	done


#!/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 pass
	do
		useradd $user
		echo $pass|passwd --stdin $user
	done < user_pass.file

pwgen工具产生随机密码:

[root@server shell04]# pwgen -cn1 12
Meep5ob1aesa
[root@server shell04]# echo user0{1..3}:$(pwgen -cn1 12)
user01:Bahqu9haipho user02:Feiphoh7moo4 user03:eilahj5eth2R
[root@server shell04]# echo user0{1..3}:$(pwgen -cn1 12)|tr ' ' '\n'
user01:eiwaShuZo5hi
user02:eiDeih7aim9k
user03:aeBahwien8co

二、嵌套循环

关键字:大圈套小圈
🕒时钟:分针与秒针,秒针转⼀圈(60格),分针转1格。循环嵌套就是外层循环⼀次,内层循环⼀轮。

  1. 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。
  2. 每次外部循环都会触发内部循环,直至内部循环完成,才接着执行下一次的外部循环。
  3. for循环、while循环和until循环可以相互嵌套。
  4. 应用案例

㈠ 打印指定图案

1 
12
123
1234
12345
5 
54
543
5432
54321

㈡ 落地实现1

X轴:
for ((i=1;i<=5;i++));
	do 
		echo -n $i;
	done
Y轴:
负责打印换行
#!/bin/bash
for ((y=1;y<=5;y++))
	do
		for ((x=1;x<=$y;x++))
		do
			echo -n $x
		done
		echo
	done

#!/bin/bash
for ((y=1;y<=5;y++))
	do
		x=1
		while [ $x -le $y ]
			do
				echo -n $x
				let x++
			done
		echo
	done

㈢ 落地实现2

Y轴:打印换行
X轴:打印数字 5-1
#!/bin/bash
y=5
while (( $y >= 1 ))
	do
		for ((x=5;x>=$y;x--))
		do
			echo -n $x
		done
		echo
		let y--
	done

#!/bin/bash
for (( y=5;y>=1;y--))
	do
		for (( x=5;x>=$y;x--))
		do
			echo -n $x
		done
		echo
	done

#!/bin/bash
y=5
while [ $y -ge 1 ]
	do
		for ((x=5;x>=$y;x--))
		do
			echo -n $x
		done
		echo
		let y--
	done

#!/bin/bash
y=1
until (( $y >5 ))
	do
		x=1
		while (( $x <= $y ))
		do
			echo -n $[6-$x]
			let x++
		done
		echo
		let y++
	done

三、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.sh

1)定义变量
#!/usr/bin/expect
set ip 10.1.1.2
set pass 123456
set timeout 5
spawn ssh root@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$pass\r" }
} 

interact
2)使用位置参数
#!/usr/bin/expect
set ip [ lindex $argv 0 ]
set pass [ lindex $argv 1 ]
set timeout 5
spawn ssh root@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$pass\r" }
} 
interact

需求2:A远程登录到server上操作

#!/usr/bin/expect
set ip 10.1.1.1
set pass 123456
set timeout 5
spawn ssh root@$ip
expect {
"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 123456
10.1.1.2 123456
1. 循环
2. 登录远程主机——>ssh——>从ip.txt文件里获取IP和密码分别赋值给两个变量
3. 使用expect程序来解决交互问题
#!/bin/bash
# 循环在指定的服务器上创建用户和文件
while read ip pass
	do
		/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
		END
	done < ip.txt

#!/bin/bash
cat ip.txt|while read ip pass
do
{ 
	/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
wait
echo "user is ok...."
0

评论区