鸡兔同笼
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
假设全部为鸡
[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[@]}"
说明:
一种简单的排序算法,通过重复遍历要排序的数列,比较每对相邻的元素,如果它们的顺序错误就把它们交换过来