大家好呀!今天简单聊一聊Shell中的random随机数。随机数的生成及应用非常广泛常见,了解随机数的使用也是有必要的。

1、基本用法

bash默认有一个$RANDOM的变量,默认是0~32767。

set |grep RANDOM:查看上一次产生的随机数

powershell
1
2
3
4
5
6
7
8
9
10
11
12
13
# 默认是0~32767
echo $RANDOM
# 查看上一次产生的随机数
set |grep RANDOM

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

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

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

依此类推,产生0~n之间的随机数:echo $[$RANDOM%(n+1)]

巧妙的利用加法:

powershell
1
2
3
4
5
# 产生50-100之内的随机数
echo $[$RANDOM%51+50]

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

2、简单应用

编写一个脚本,产生一个phonenum.txt文件,随机产生以139开头的手机号1000个,每个一行。

1)创建一个random.sh脚本

powershell
1
vim random.sh

2)根据要求编写脚本文件

法1:列表循环

powershell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 循环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


法2:类c风格

powershell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# random phonenum
# 循环1000次产生电话号码
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" >> phonenum.txt
done

法3:while循环

powershell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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

使用break

3、嵌套循环

所谓嵌套循环,即一个循环体内又包含另一个完整的循环。在外部循环的每次执行过程中都会触发内部循环,直至内部完成一次循环,才接着执行下一次的外部循环。

for、while和until循环可以相互嵌套

eg:以再经典不过的打印九九乘法表为例

法1:for循环

powershell
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
for ((y=1;y<=9;y++))
do
for ((x=1;x<=$y;x++))
do
echo -ne "$x*$y=$[$x*$y]\t"
done
echo
echo
done


法2:while循环

powershell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
y=1
while [ $y -le 9 ]
do
x=1
while [ $x -le $y ]
do
echo -ne "$x*$y=$[$x*$y]\t"
let x++
done
echo
echo
let y++
done

法3:util循环

powershell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
y=1
until [ $y -gt 9 ]
do
x=1
until [ $x -gt $y ]
do
echo -ne "$x*$y=$[ $x*$y ]\t"
let x++
done
echo
echo
let y++
done