shell100例 不会的语句 man bash查询(4)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值