shell脚本小练习
在外面报了培训班,老师布置了几个小作业,发上来记录作业的内容,避免手误删掉了我的脚本
1.整数的四则运算
输入两个数,对其进行加、减、乘、整除的操作。
要求:
①输入的是数字
②如果是除法操作时,除数不能为0。
代码如下:
menu(){
echo "有以下操作:1:加法;2:减法;3:乘法;4:除法;5:退出"
read -p "请输入你的选择:" ans
}
#接受用户输入
input1(){
while :
do
read -p "请输入第一个操作数:" n1
if ! echo $n1 |egrep "[^0-9]" &>/dev/null ;then
break
fi
done
}
input2(){
while :
do
read -p "请输入第二个操作数:" n2
if ! echo $n2 |egrep "[^0-9]" &>/dev/null;then
break;
fi
done
}
f_sum(){
input1
input2
echo "$n1+$n2=$(($n1 + $n2))"
}
f_sub(){
input1
input2
echo "$n1-$n2=$(($n1 - $n2))"
}
f_mul(){
input1
input2
echo "$n1*$n2=$(($n1 * $n2))"
}
f_div(){
input1
while :
do
input2
if (($n2!=0));then
break;
fi
echo "除数不能为0"
done
echo "$n1/$n2=$(($n1 / $n2))"
}
main(){
menu
case $ans in
1)
f_sum
;;
2)
f_sub
;;
3)
f_mul
;;
4)
f_div
;;
5)
exit
;;
*)
echo "输入错误,请输入1,2,3,4,5"
;;
esac
}
while :
do
main
read -p "按任意键继续"
clear
done
运行截图:
2.输入一个分数,返回其等级
要求:
①输入的内容是数字,且数字必须是0-100之间
②输入不能为空
代码如下:
#!usr/bin
df(){
if (( $1 > 90 && $1 <= 100 )) ;then
dj='A'
elif (( $1 > 80 ));then
dj='B'
elif (( $1 > 70 ));then
dj='C'
elif (( $1 >= 0 ));then
dj='D'
fi
}
main(){
while :
do
read -p "请输入分数" score
#判断输入的分数是数字
if echo $score |egrep "^[0-9]+\b" &>/dev/null;then
#判断数字是否在0-100之间
if (( $score >=0 && $score <=100 ));then
break
else
echo "请输入0-100之间的数值"
fi
#判断用户输入的是否为空
elif [[ $score == '' ]];then
echo "分数长度不为0"
fi
done
df $score
echo "您的分数是$dj"
}
main
运行截图:
3.截取出/etc/passwd文件里面所有的用户名,然后输出hello,用户名
代码如下:
#!/usr/bin
username=$( cat /etc/passwd|awk -F: '{print $1}')
for i in $username:
do
echo "hello,${i}"
done
运行截图:
4.扫描局域网内有哪些服务器开放了80和3306端口
要求:
①扫描局域网内开放了80号端口的服务器,将其写入open_web_pc.txt文档中
②扫描局域网内开放了3306号端口的服务器,将其写入open_mysql_pc.txt文档中
代码如下:
#!/usr/bin
#!/bin/usr
#定义统计80端口和3306端口服务器开启的数量
open_80=0
open_3306=0
>open_web_pc.txt
>open_mysql_px.txt
#扫描网段192.168.0.1-254,
for i in $(seq 254)
do
if ping 192.168.0.${i} -c 1 -i 0.01 &>/dev/null;then #判断ip是否存活
if ncat -z 192.168.0.${i} 80 &>/dev/null;then #判断80服务器是否开启
echo "服务器192.168.0.${i}开启了80号端口" >>open_web_pc.txt
open_80=$(($open_80+1)) #统计量+1
elif ncat -z 192.168.0.${i} 3306 &>/dev/null;then
echo "服务器192.168.0.${i}开启了3306号端口" >>open_mysql_pc.txt
open_3306=$((open_3306+1))
fi
fi
done
echo "共有$open_80个服务器使用80号端口"
echo "共有$open_3306个服务器使用3306号端口"
运行截图:
查看open_web_pc.txt的内容如下:
5.扫描出局域网内正在使用的ip地址
要求:将正在使用的ip地址写入ip_up.txt,将未使用的ip地址写入ip_down.txt
代码如下:
#!/usr/bin
>ip_up.txt
>ip_down.txt
for i in $(seq 254)
do
if ping 192.168.0.${i} -c 1 -i 0.01 &>/dev/null;then
echo "192.168.0.${i}地址正在使用" >>ip_up.txt
else
echo "192.168.0.${i}地址未使用" >>ip_down.txt
fi
done
运行截图:
查看ip_up.txt的内容
6.批量生成用户密码,用户名由用户自己输入
要求:用户输入用户名,系统自动为其分配20位的密码,密码必须包含大写,小写,特殊字符,数字,并将用户名和密码写入user_ped.txt里面
代码如下:
#将用户名和密码记录到文件里user_ped.txt里,格式:用户名 密码
getpd(){
digit=(0 1 2 3 4 5 6 7 8 9) #得到所有的数字
#得到所有的小写字母数组
L_eph=(a b c d e f g h i j k l m n o p q \r s t u v w x y z)
#得到所有的大写字母数组
U_eph=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
#得到所有的特殊字符
symbol=('~' '#' '!' @ '&' $ % ^ _ - + . , ?)
pd=""
total=(${digit[@]} ${L_eph[@]} ${U_eph[@]} ${symbol[@]})
for i in {1..20} #随机生成20位的密码
do
pd=${pd}${total[(($RANDOM%(${#total[@]})))]}
done
echo $pd
}
>user_ped.txt
for i in {1..10}
do
read -p "请输入你的用户名:" username
while :
do
getpd
if ! echo $pd | egrep ".*${digit[@]}.*${L_eph[@]}.*${U_eph[@]}.*${symbol[@]}.*" &>/dev/null;then
echo "$username $pd" >>user_ped.txt
break
fi
done
done
运行截图:
7.监控内存的使用
要求:一旦内存使用率超过70%,就提醒用户,并将发生时间和使用率写入日志文件
代码如下:
#!/usr/bin
#入/var/log/memory.log中,格式是发生的时间,内存的使用率
>/var/log/memory.log #清空文件内容
#以列表的形式得到总内存
total=($(free -m |awk '{print $2}'|egrep "[0-9]"|tr '\n' ' ' ))
#以列表形式得到空闲率
free=($(free -m |awk '{print $4}'| egrep "[0-9]" |tr '\n' ' '))
for i in $(seq ${#total[@]})
do
#计算使用率
per=0$(echo "scale=4;1-${free[(($i-1))]}/${total[(($i-1))]}" |bc)
a=$(echo "$per> 0.7"|bc) #如果使用率超过70%,则写入内存
if (($a==1));then
echo "$(date +%Y-%m-%d_%H_%M_%S) $per" >>/var/log/memory.log
fi
done
运行截图:
查看日志文件: