shell练习

  1. ping某一规定段内的所有IP
#!/bin/bash
ping_test(){
    i=1
    for i in {1..5}
    do
        ping -c 2 -w 3 -i 0.3 192.168.1.$i 2> /dev/null
        if [ $? -eq 0 ];
        then
            echo 'ping 192.168.1.'$i' is ok'
        else
            echo 'ping 192.168.1.'$i' is not ok'
        fi
        let i++
    done
}
ping_test  #调用函数

eg:ping192.168.1.1-192.168.1.5 这五个IP。
ping命令的用法:
在这里插入图片描述
-c:Stop after sending count ECHO_REQUEST packets 当发送count计数个数据包后停止

-w:Time to wait for a response, in seconds. The option affects only timeout in absence of any responses, otherwise ping waits for two RTTs. 等待响应的时间(秒)。

-i:Wait interval seconds between sending each packet. The default is to wait for one second between each packet normally, or not to wait in flood mode. Only super-user may set interval to values less than 0.2 seconds. 发送每个数据包之间等待间隔秒数。

结果如下:
在这里插入图片描述

  1. 查找100之内的所有奇数
#!/bin/bash
find_jishu(){
    i=1
    j=0
    for i in {1..100}
    do
        result=$[$i%2]
        if [ $result -eq 1 ];  #-eq等于、-lt小于、-gt大于
        then
            result_list[$j]=$i #将找到的奇数存放在新的列表中
        fi
        let i++
        let j++
    done

    echo ${result_list[*]}
}
find_jishu  #调用函数

结果如下:
在这里插入图片描述如果下面的操作中需要用到这个结果列表,可以这样获取这个函数的返回值:
方法1:

result_list=`find_jishu`  #需要得到返回值时,调用函数的方式1
echo '得到的返回值:'
echo ${result_list[*]}  #打印得到的结果

在这里插入图片描述方法2:

result_list=$(find_jishu) #需要得到返回值时,调用函数的方式2
echo '得到的返回值:'
echo ${result_list[*]}

在这里插入图片描述
这里需要强调说明的是:在find_jishu函数中,为什么返回列表的时候是用的echo,而非return。因为return返回值的大小及多少在shell中是有限制的,所以列表返回不适用。【return命令会返回一个单一的数字参数,return返回的数字参数是有限制的,最大返回255,超过255,则从0开始计算】

  1. 计算指定数的阶乘
Calculate_factorial(){ 
    read -p 'please input a number:' number  #获取指定的数据 
    result=1
    for ((i=1;i<=$number;i++))
    do
        result=$[$result*$i]  #将计算的结果赋值给result
    done
    echo $result  #因为return的值不能超过255 所以此处还是用echo
}
Calculate_factorial  #调用函数  如果需要得到函数的返回值,方式如题2

结果如下:
在这里插入图片描述

  1. 给无序的列表进行排序,然后再插入一个数据
insert_number_fun(){
    listarr=(23 12 5 45 21 72 58 64)
    #给无序列表进行排序
    for ((i=0;i<${#listarr[*]};i++))  #  ${#listarr[*]}是计算这个列表的长度
    do 
        for ((j=$i+1;j<${#listarr[*]};j++))
        do 
            if [ ${listarr[$i]} -gt ${listarr[$j]} ];
            then
                tmp=${listarr[$i]}
                listarr[$i]=${listarr[$j]}
                listarr[$j]=$tmp
            fi
        done
    done
    echo ${listarr[*]}   #打印排好序的列表 5 12 21 23 45 58 64 72

    #接收需要插入的数据
    read -p 'please input a number:' number  #获取需要插入的数据
    index=-1
    #在已经排好序的列表中 找到可以插入的位置
    for ((i=0;i<${#listarr[*]};i++))
    do
        if [[ ${listarr[$i]} -gt $number ]];
        then
            #index=$[$i-1]
            index=$i
            break
        fi
    done
    echo $index  #打印已经找到的位置
    
    #找到可以放的位置了之后 将后面的数据依次向后挪 留出位置来插入
    for ((i=${#listarr[*]-1]};i>=$index;i--))
    do
        j=$i+1
        listarr[$j]=${listarr[$i]}  #或者 listarr[$[$i+1]]=${listarr[$i]}
    done
    listarr[$index]=$number   #在留出的位置处放上要插入的数据
    echo ${listarr[*]}  #打印插入好的列表
}

insert_number_fun  #调用函数

结果如下:

在这里插入图片描述

  1. 将题4,封装为多个接口实现【这个里面重点主要是:函数的调用、返回值的处理】
#给无序数组排序
#!/bin/bash
sort_list(){
    listarr=(23 12 5 45 21 72 58 64)
    #echo ${#listarr[*]}   计算数组的长度
    for ((i=0;i<${#listarr[*]};i++))
    do
        for ((j=0;j<$i;j++))
        do 
            if [ ${listarr[$i]} -lt ${listarr[$j]} ];  #-lt是小于 -gt是大于
            then
                tmp=${listarr[$i]}
                listarr[$i]=${listarr[$j]}
                listarr[$j]=$tmp
            fi
        done
    done
    echo ${listarr[*]}
    #return ${listarr[*]} 不能用return进行返回 因为return只能返回一个不大于255的数据  不能返回一个类似于列表的一串数据
}

#获取要插入的数据
input_number(){
    read -p 'please input a number:' number
    echo $number
}

#根据要插入的数据,找到适合插入的位置
find_index(){
    index=-1
    number=`input_number` #调用input_number函数,获取要插入的数据
    for i in $*
    do
        index=$[$index+1]
        if [ $i -gt $number ];
        then
            break
        fi
    done
    echo $index  #用echo返回一个值:找到的插入位置下标
    return $number #用return返回一个值:要插入的数据
}

#计算 排序函数sort_list的返回值列表的长度 
#在这里没有直接用 ${#arrlist[*]}来计算长度 是因为sort_list函数的返回值并不是一个列表类型
arrlist_len(){
    leng=0
    for i in $*   #$* 指获取所有的实参列表。因为传过来的实参是sort_list函数的返回值,但是因为类型不是列表类型,所以是一串数据 
    do
        let leng++
    done
    echo $leng
}

#在这个函数中,调用上面多个函数
insert_number(){
    lista=`sort_list` #先调用sort_list函数进行排序
    listarr=${lista[*]} #将sort_list函数的返回值赋给listarr
    echo ${listarr[*]}  #打印返回的结果

    ind=$(find_index ${listarr[*]}) #调用find_index 函数,${listarr[*]是调用find_index函数时要传递的实参,获取数据应该插入的位置下标 【在这个函数中,需要返回两个返回值,一个是找到的位置下标index,另一个是需要插入的数据number】
    number=$?  #$? 最后运行的命令的结束代码(返回值)  用$?来获取find_index函数用echo返回的结果,并且在此处一定要先去接收number,如果先接收return返回值,那么这个echo返回的结果会丢失
    index=$ind #用ind去接收find_index函数中return返回的值,并将其赋给index
    #number=$?
    echo $index,$number #打印接收到的两个值
   
    leng=`arrlist_len ${listarr[*]}` #调用arrlist_len函数,获取sort_list函数返回的listarr列表的长度
    j=0
    for i in ${listarr[*]}
    do 
       listarrout[$j]=$i  #因为sort_list函数返回的值不是列表类型,所以此处将返回的每个值放入列表中,在后面的操作中比较方便
       let j++
    done
    echo ${listarrout[*]} #打印存放好的列表
    leng=$leng-1
    for ((i=$leng;i>=$index;i--)) #将index位置后面的每个元素往后挪一位,给要插入的数据留出位置
    do 
        j=$[$i+1]
        echo 'value:',${listarrout[$i]}
        listarrout[$j]=${listarrout[$i]}
    done
    
    echo $index
    listarrout[$index]=$number #将index位置上放入要插入的数据number
    echo ${listarrout[*]}
}

结果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值