20、自动检查逻辑卷,使用率大于92%,自动扩容
#!/bin/bash
# File Name: volume_atuo_extend.sh
tmpfile=/tmp/volume_atuo_extend.txt
df -h|grep "/dev/mapper/"|awk {'print $1,$5'} > $tmpfile
sed -ri 's/%//' $tmpfile
while read device use;do
if [ $use -ge 92 ];then
lvextend -r -L +2G $device
else
exit
fi
done < /tmp/volume_atuo_extend.txt
rm -rf $tmpfile
#ubantu下定时脚本需要添加sudo和重定向 &> /dev/null
* * * * * cd /home/cjz/ && sudo ./volume_atuo_extend.sh &> /dev/null
每分钟执行 * * * * *
每五分钟执行 */5 * * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
21、自动分区磁盘,并分区ext4系统,挂在到
#!/bin/bash
# File Name: auto_disk_partition.sh
DEVICE=/dev/sdc
SIZE=+5G
NUM=1
fdisk $DEVICE << EOF &> /dev/null
n
p
$NUM
$SIZE
w
q
EOF
mkfs.ext4 "$DEVICE$NUM" &> /dev/null
#UUID=blkid $DEVICE |sed -rn 's/.*UUID="([[:graph:]]+)" .*/\1/p'
UUID=`blkid "$DEVICE$NUM" |awk -F'"' '{print $2}'`
echo "$UUID ext4 default 0 0" >> /etc/fstab
mount -a
22、 网络和IP地址计算器
#!/bin/bash
#把PREFIX换算为二进制
read -p "请输入子网掩码(数字格式):" PREFIX
read -p "请输入ip (格式 10.0.0.1):" IP
for (( i=1;i<=32;i++ )) ; do
if [ $i -le $PREFIX ];then
echo -n "1"
if [[ "$i" =~ ^8$|^16$|^24$|^32$ ]];then
echo
continue
fi
else
echo -n "0"
if [[ "$i" =~ ^8$|^16$|^24$|^32$ ]];then
echo
continue
fi
fi
done > tmp1.txt
#把IP换算为二进制
echo "$IP"|tr "." "\n"|while read j;do
binary=`echo "obase=2;ibase=10;$j"|bc`
NUM=$[`echo "$binary"|wc -m`-1]
for i in `seq 8`;do
if [ $NUM -le 7 ];then
binary=`echo -n '0'$binary`
let NUM++
else
continue
fi
done
echo $binary
done > tmp2.txt
#PREFIX和IP与运算
for X in {1..32};do
for Y in $X;do
NETMASK=`cat tmp1.txt |tr -d "\n" |cut -c $X`
IPBINARY=`cat tmp2.txt |tr -d "\n" |cut -c $Y`
Z=$[$NETMASK+$IPBINARY]
if [ $Z -eq 2 ];then
echo -n "1"
else
echo -n "0"
fi
break
done
done > tmp3.txt
ONE=$(echo "obase=10;ibase=2;`cat tmp3.txt |cut -c 1-8`"|bc)
TWO=$(echo "obase=10;ibase=2;`cat tmp3.txt |cut -c 9-16`"|bc)
THREE=$(echo "obase=10;ibase=2;`cat tmp3.txt |cut -c 17-24`"|bc)
FOUR=$(echo "obase=10;ibase=2;`cat tmp3.txt |cut -c 25-32`"|bc)
echo
echo "IP所在网络为:$ONE.$TWO.$THREE.$FOUR"
rm tmp{1..3}.txt &> /dev/null
HOSTNUM=`echo "2^(32-"$PREFIX")-2"|bc 2> /dev/null`
#$(())中无法进行^运算
#$HOSTNUM=$((2^(32-$PREFIX)-2))
echo "网络中可用主机数:$HOSTNUM个"
23、二进制转换计算器
#!/bin/bash
#二进制转化10进制
binary-decimal ()
{
LENGTH=$[(`echo "$i"|wc -m`)-1]
for j in `seq $LENGTH`;do
h=`echo $i|cut -c $j`
if [ $h -ge 2 ];then
echo "请输入合法的二进制数字: 1 或 0"
echo
fun_restart
else
[ $LENGTH -eq $j ] && echo "obase=10;ibase=2;$i"|bc
fi
done
}
#10进制转化二进制
decimal-binary ()
{
[[ $i =~ [0-9]+ ]] && echo "obase=2;ibase=10;$i"|bc || { echo "请输入合法的十进制数字: ";echo;fun_restart; }
}
fun_restart () {
MENU='
二进制转化十进制
十进制转化二进制
重新输入
退出
'
#如何判断i十2^[[A^[这种情况?
#select M in $MENU,如何一行一行
while :;do
read -p "请输入需要转化的值: " i
#[[ $i =~ [[:graph:]] ]] || { echo "请输入数字";exit; }
[[ $i =~ ^[[:digit:]]+$ ]] || { echo "请输入数字";exit; }
#[[ $i =~ [0-9]+ ]] || { echo "请输入数字";exit; }
echo
PS3="请选择 1-4: "
select M in $MENU;do
case $REPLY in
1)
binary-decimal
;;
2)
decimal-binary
;;
3)
echo
fun_restart
;;
4)
exit
;;
*)
echo "暂不支持,请输入1或2"
;;
esac
done
done
}
fun_restart
24、function实现阶乘
###错误错误错误,没有退出。陷入死循环,导致死机了
[root@centos8-3 /date/shell ]$ cat fact.sh
#!/bin/bash
# File Name: fact.sh
fun_fact ()
{
if [ $1 -eq 0 -o $1 -eq 1 ];then
echo "1"
else
echo "$[$1*`fun_fact $1`]"
fi
}
fun_fact $1
###正确正确正确,$(fun_fact $[$1-1])实现递减,完成函数退出
#!/bin/bash
# File Name: fact.sh
fun_fact ()
{
if [ $1 -eq 0 -o $1 -eq 1 ];then
echo "1"
else
echo "$[$1*$(fun_fact $[$1-1])]"
fi
}
fun_fact $1
25、实现转置矩阵 matrix.sh
#!/bin/bash
printf " %s %s %s\n" 1 2 3 4 5 6 7 8 9
echo
#给数组赋值
h=1
for i in {0..2};do
for j in {0..2};do
NUM[$i$j]=$h;
[[ $h =~ ^4$|^7$ ]] && { echo;echo -n " ${NUM[$i$j]}"; } || echo -n " ${NUM[$i$j]}" ;
let h++
done
done
echo
#实现数组转置
echo
h=1
for i in {0..2};do
for j in {0..2};do
if [ $i -eq $j ];then
[[ $h =~ ^4$|^7$ ]] && { echo;echo -n " ${NUM[$i$j]}"; } || echo -n " ${NUM[$i$j]}" ;
else
[[ $h =~ ^4$|^7$ ]] && { echo;echo -n " ${NUM[$j$i]}"; } || echo -n " ${NUM[$j$i]}" ;
fi
let h++
done
done
echo
26、随机生成10个数字,冒泡法降序排序
#!/bin/bash
# File Name: bubble.sh
for ((i=0;i<=9;i++));do
NUM[$i]=`echo $RANDOM`
done
echo ${NUM[@]}
for ((j=1;j<=10;j++));do
#seq $j 9,排除以完成的参数,实现循环递减
for h in `seq $j 9`;do
MAX=${NUM[$[j-1]]}
if [ $MAX -lt ${NUM[$h]} ];then
#实现变量互换
NUM[$j-1]=${NUM[$h]}
NUM[$h]=$MAX
fi
done
done
echo
echo -e "\E[1;32m降序如下:\E[0m"
for ((i=0;i<=9;i++));do
echo "${NUM[$i]}"
done
错误,没计算出来
#!/bin/bash
# File Name: buule.sh
#错误,没计算出来
for ((i=0;i<3;i++));do
NUM[$i]=`echo $RANDOM`
done
echo ${NUM[@]}
for i in `seq ${#NUM[@]}`;do
z=$j
#unset之后确认数组不为空
if [ -z "${NUM[$j]}" ];then
continue
else
#用第一个数组遍历所有数组,取出最小值
for ((h=0;h<3;h++));do
if [ -n "${NUM[$h]}" ];then
[ ${NUM[$j]} -gt ${NUM[$h]} ] && { j=$h;MIN=${NUM[$h]}; } || { MIN=${NUM[$z]}; }
else
continue
fi
done
fi
#确认最小值的下标,然后unset
for ((y=0;y<3;y++));do
[ -z ${NUM[$y]} ] && continue
if [ "${NUM[$y]}" -eq "$MIN" ];then
unset NUM[$y]
fi
done
j=$z
echo $MIN
[ ${#NUM[@]} -eq 0 ] && exit
done