- 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. 发送每个数据包之间等待间隔秒数。
结果如下:
- 查找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开始计算】
- 计算指定数的阶乘
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
结果如下:
- 给无序的列表进行排序,然后再插入一个数据
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 #调用函数
结果如下:
- 将题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[*]}
}
结果如下: