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取余数

获取随机8位数字

[root@wenzi wenzi]# echo $RANDOM | cksum | cut -c 1-8
29060609

[root@wenzi ~]$openssl rand -base64 9 | cksum | cut -c 1-8
40398615

判断合法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]表示任意数字

| 指逻辑上的或

对个位数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是取消行末的换行符,不换行。

连续输入5个1~100之间整数,计算和、统计最小数字、最大数字

[root@wenzi wenzi]# vim test.sh
#!/bin/bash
count=1
sum=0
min=100
max=0
PS3="请输入5次1至100间的整数"
while [ $count -le 5 ];do
        read -p "第$count次输入:" num
        if [[ $num =~ ^[1-9][0-9]?$ ]] || [[ $num == 100 ]];then
                sum=$[$sum+$num]
                [ $max -lt $num ] && max=$num
                [ $min -gt $num ] && min=$num
                let count++
        else
                echo "必须输入1~100之间的整数,不接受以0开头的数字形式"
        fi
done
echo "sum: $sum"
echo "min: $min"
echo "max: $max"

说明:

一位数和两位数的匹配规则和 判断合法IP 道理一样;^[1-9][0-9]?$ 匹配1~99之间的数字;100单独匹配,使用==而不用 -eq 原因是避免输入小数导致脚本出现报错信息,eq/gt等匹配的是整数。

在Shell中,以0开头的数字被解释为八进制数,使用会出现报错或计算出错;比如 1+99 和 1+099计算结果是不一样的

冒泡排序

#!/bin/bash
declare -a arry

for i in `seq 1 10`;do
        arry[$i]=$RANDOM
done

echo "排序前数组: ${arry[@]}"

for ((j=1;j<=9;j++));do
        for ((i=1;i<=9;i++));do
                if [ ${arry[$i]} -gt ${arry[$i+1]} ];then
                        tmp=${arry[$i]}
                        arry[$i]=${arry[$i+1]}
                        arry[$i+1]=$tmp
                fi
        done
done

echo "排序后数组: ${arry[@]}"

说明:

一种简单的排序算法,通过重复遍历要排序的数列,比较每对相邻的元素,如果它们的顺序错误就把它们交换过来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值