shell编程4-shell嵌套循环及随机数

本文介绍了Shell编程中如何生成随机数以及使用嵌套循环实现特定功能。通过实例展示了如何生成以134开头的手机号,并从中抽取幸运观众。此外,还讲解了如何利用嵌套循环打印九九乘法表。最后,对Shell中的变量定义、循环语句和内置命令进行了总结,并提及了expect命令在自动应答中的应用。
摘要由CSDN通过智能技术生成

一.随机数

bash默认有一个$RANDOM的变量		默认是0~32767。使用set |grep RANDOM	查看上一次产生的随机数
echo $RANDOM

产生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]

实战案例:

  • 1.写一个脚本,随机产生以134开头的手机号100个,每个一行写入到phonenum.txt文件中
分析:
1. 产生100个电话号码,脚本需要循环100次
2. 134+8位,后8位随机产生,可以让每一位数字都随机产生,$[RANDOM%10] 0-9
3. 将随机产生的数字分别保存到变量里,然后加上134保存到文件里
[root@shell ~]# vim phonenum.sh
#!/bin/bash
for i in {1..100}
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 "134$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt
done
[root@shell ~]# source phonenum.sh 
[root@shell ~]# tail phonenum.txt 
13489797116
13400443887
13418483291
13461270741
13416077839
13470805899
13498525631
13451583328
13425220419
13405672110
[root@shell ~]# cat phonenum.txt |wc -l
100
  • 2.在上面的100个手机号码中抽取5个幸运观众,并只显示头3个数字和尾号四个数字,中间的数字使用*代替
分析:
1.确定幸运观众所在的行		随机生成 RANDOM   $[RANDOM%1000+1]
2.将电话号码提取出来              headtail
3.显示前3个和后4个数到屏幕     最后将电话号码输出到屏幕   echo ${电话号码部分}
[root@shell ~]# vim phonemem.sh    
#!/bin/bash
file=/root/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 "134****${luck:7:4}" && echo $luck >> /root/luck_num.txt
        # 显示到屏幕
done
[root@shell ~]# source phonemem.sh 
134****7381
134****5575
134****9506
134****9430
134****4080

二.嵌套循环

一个循环体内又包含另一个完整的循环结构,称为循环的嵌套.在外部循环的每次执行过程中都会触发内部循环,直至内部完成一次循环,才接着执行下一次的外部循环.for循环,while循环和until循环都可以相互嵌套.
例:打印一个九九乘法表

[root@shell ~]# vim 1.sh    
#!/bin/bash
for i in {1..9}
do
        u=1
        while [ $u -le $i ]
        do
                echo -ne "$u*$i=$[ $u*$i ]\t"
                # -n 不要在最后自动换行
           # -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
                let u++
        done
        echo
        echo
        # 换行
done
[root@shell ~]# source 1.sh 
1*1=1

1*2=2   2*2=4

1*3=3   2*3=6   3*3=9

1*4=4   2*4=8   3*4=12  4*4=16

1*5=5   2*5=10  3*5=15  4*5=20  5*5=25

1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36

1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49

1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64

1*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=81

三.总结

1.变量定义

普通变量定义:
变量名=值		shell变量默认可以赋予任何类型
$变量名		${变量名}		${变量名:从第几个字符开始:截取几个字符}
unset 变量名

交互式:
read 变量名
-p
-t
-s
-n

数组定义:
array=(var1 var2 var3 ...)
array[0]=var1
array[1]=var2
array[2]=var3
普通数组:数组的索引是整数

定义关联数组
关联数组:索引是字符串

获取数组里的元素:
${array[*]}
${array[2]}
${array[@]:1:2}
${!array[@]}		获取数组的索引号(下标)
${#array[@]}		获取数组索引号的个数

定义有类型的变量:
declare
-i
-x
-a
-A	

2.循环语句

for:
列表循环、非列表循环、类C风格			循环次数已知
while:
条件为真,进入循环,条件为假,退出循环	循环次数跟条件有关
until:
条件为假,进入循环,条件为真,退出循环	循环次数跟条件有关

3.影响shell程序的内置命令

exit			退出整个程序
break		   结束当前循环,或跳出本层循环
continue 	忽略本次循环剩余的代码,直接进行下一次循环
shift			使位置参数向左移动,默认移动1位,可以使用shift 2

4.补充扩展expect

expect 自动应答 tcl语言

Tcl(最早称为“工具命令语言”“Tool Command Language”, 但是已经不是这个含义,不过我们仍然称呼它为TCL)是一种脚本语言。 由John Ousterhout创建。 TCL很好学,功能很强大。TCL经常被用于 快速原型开发,脚本编程,GUI和测试等方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值