Shell脚本练习——数字相关

鸡兔同笼

今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

假设全部为鸡

[root@wenzi data]#vim chook_rabbit.sh 
#!/bin/bash
head=$1
foot=$2
rabbit=$((($foot-$head*2)/2))
chook=$[$head-$rabbit]
echo rabbit is $rabbit
echo chook is $chook
[root@wenzi data]#bash chook_rabbit.sh 35 94
rabbit is 12
chook is 23

说明:

实现算术方式有 var=$((算术表达式))或 var=$[算术表达式],若嵌套则加入小括号,优先计算小括号内的。sum=$(((1+3)/3))等价于sum=$[(1+3)/3]

生成0-49间随机数

[root@wenzi data]#vim rd.sh 
#!/bin/bash
echo "$[$RANDOM%50]"
[root@wenzi data]#bash rd.sh 
3
[root@wenzi data]#bash rd.sh 
49
[root@wenzi data]#bash rd.sh 
21
[root@wenzi data]#bash rd.sh 
5

说明:

生成0~x间随机数,即对x+1取余数

生成m~n间随机数,即对n+1+m取余数

判断合法IP

[root@wenzi data]#vim checkIP.sh 
#!/bin/bash
ip=$1
if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]];then
	echo $ip is valid
else
	echo $ip is invalid
fi
[root@wenzi data]#bash checkIP.sh 192.168.29.141
192.168.29.141 is valid
[root@wenzi data]#bash checkIP.sh 192.168.29.1411
192.168.29.1411 is invalid
[root@wenzi data]#bash checkIP.sh 00.168.29.141
00.168.29.141 is invalid

说明:

对个位数IP(范围:0~9)、十位数IP(范围:10~99)、百位数IP(范围:100~199和200~249和250~255)依次进行判断

[[ 判断式 ]]中 =~ 表示左侧字符串是否能够被右侧的拓展正则表达式所匹配

^指待查找的字符串(word)在行首;$指待查找的字符串(word)在行尾

[n1-n2]在括号内列出待查找的范围,[0-9]表示任意数字

|指逻辑上的或

[0-9]对个位数IP匹配;[1-9][0-9]对十位数IP匹配;1[0-9][0-9]与2[0-4][0-9]与

对个位数IP匹配:[0-9]

对十位数IP匹配:[1-9][0-9]

将个位与十位匹配规则合并即 [0-9]变为[1-9]?[0-9]

?指0个或一个的前一个字符

对百位数IP匹配:1[0-9][0-9]|2[0-4][0-9]|25[0-5] 合并为 1[0-9]{2}|2[0-4][0-9]|25[0-5]

\.使用转义符将.作为普通字符

()使用小括号将上述内容作为整体

{3}重复三次,匹配IP地址前三段

第四段IP无需以.分割

计算1+2+3+...+100的和

[root@wenzi data]#cat sum.sh 
#!/bin/bash
sum=0
for i in {1..100};do
	let sum+=i
done
echo "1+2+3+...+100的和为:$sum"
[root@wenzi data]#bash sum.sh 
1+2+3+...+100的和为:5050

计算1到100内所有奇数之和

[root@wenzi data]#vim sumOdd.sh 
#!/bin/bash
sumOdd=0
for i in {1..100..2};do
	let sumOdd+=i
done
echo "从1到100所有奇数之和为:$sumOdd"
[root@wenzi data]#bash sumOdd.sh 
从1到100所有奇数之和为:2500
[root@wenzi data]#vim oddSum.sh 
#!/bin/bash
oddSum=0
for ((i=1;i<=100;i+=2))
do
	let oddSum+=i
done
echo "从1到100所有奇数之和为:$oddSum"
[root@wenzi data]#bash oddSum.sh 
从1到100所有奇数之和为:2500

 九九乘法表

[root@wenzi data]#vim 9x9.sh 
#!/bin/bash
for i in {1..9}
do
	for j in `seq $i`
	do
		echo -e "${i}x${j}=$[i*j]\t\c"
	done
    #换行
	echo
done
[root@wenzi data]#bash 9x9.sh 
1x1=1	
2x1=2	2x2=4	
3x1=3	3x2=6	3x3=9	
4x1=4	4x2=8	4x3=12	4x4=16	
5x1=5	5x2=10	5x3=15	5x4=20	5x5=25	
6x1=6	6x2=12	6x3=18	6x4=24	6x5=30	6x6=36	
7x1=7	7x2=14	7x3=21	7x4=28	7x5=35	7x6=42	7x7=49	
8x1=8	8x2=16	8x3=24	8x4=32	8x5=40	8x6=48	8x7=56	8x8=64	
9x1=9	9x2=18	9x3=27	9x4=36	9x5=45	9x6=54	9x7=63	9x8=72	9x9=81
[root@wenzi data]#cat 9x9.sh 
#!/bin/bash
for i in {1..9}
do
	for j in $(seq `echo  $[10-i]`)
	do
		echo -ne "${j}x`echo $[10-i]`=$[(10-i)*j]\t"
	done
	#换行
	echo
done
[root@wenzi data]#bash 9x9.sh 
1x9=9	2x9=18	3x9=27	4x9=36	5x9=45	6x9=54	7x9=63	8x9=72	9x9=81	
1x8=8	2x8=16	3x8=24	4x8=32	5x8=40	6x8=48	7x8=56	8x8=64	
1x7=7	2x7=14	3x7=21	4x7=28	5x7=35	6x7=42	7x7=49	
1x6=6	2x6=12	3x6=18	4x6=24	5x6=30	6x6=36	
1x5=5	2x5=10	3x5=15	4x5=20	5x5=25	
1x4=4	2x4=8	3x4=12	4x4=16	
1x3=3	2x3=6	3x3=9	
1x2=2	2x2=4	
1x1=1	

说明:

seq n 指生成从1到n之间的整数

echo默认会在末尾添加换行符;-e指使用转义符\;\t是制表符,即Tab;\c是取消行末的换行符,不换行。

持续更新

猜你喜欢

转载自blog.csdn.net/qq_40875048/article/details/131816111