shell脚本小练习
- 1.整数的四则运算
- 代码如下:
- 运行截图:
- 代码如下:
- 运行截图:
- 代码如下:
- 运行截图:
- 代码如下:
- 运行截图:
- 代码如下:
- 运行截图:
- 代码如下:
- 运行截图:
- 代码如下:
- 运行截图:
在外面报了培训班,老师布置了几个小作业,发上来记录作业的内容,避免手误删掉了我的脚本
1.整数的四则运算
输入两个数,对其进行加、减、乘、整除的操作。
要求:
①输入的是数字
②如果是除法操作时,除数不能为0。
代码如下:
menu(){echo \"有以下操作:1:加法;2:减法;3:乘法;4:除法;5:退出\"read -p \"请输入你的选择:\" ans}#接受用户输入input1(){while :doread -p \"请输入第一个操作数:\" n1if ! echo $n1 |egrep \"[^0-9]\" &>/dev/null ;thenbreakfidone}input2(){while :doread -p \"请输入第二个操作数:\" n2if ! echo $n2 |egrep \"[^0-9]\" &>/dev/null;thenbreak;fidone}f_sum(){input1input2echo \"$n1+$n2=$(($n1 + $n2))\"}f_sub(){input1input2echo \"$n1-$n2=$(($n1 - $n2))\"}f_mul(){input1input2echo \"$n1*$n2=$(($n1 * $n2))\"}f_div(){input1while :doinput2if (($n2!=0));thenbreak;fiecho \"除数不能为0\"doneecho \"$n1/$n2=$(($n1 / $n2))\"}main(){menucase $ans in1)f_sum;;2)f_sub;;3)f_mul;;4)f_div;;5)exit;;*)echo \"输入错误,请输入1,2,3,4,5\";;esac}while :domainread -p \"按任意键继续\"cleardone
运行截图:
2.输入一个分数,返回其等级
要求:
①输入的内容是数字,且数字必须是0-100之间
②输入不能为空
代码如下:
#!usr/bindf(){if (( $1 > 90 && $1 <= 100 )) ;thendj=\'A\'elif (( $1 > 80 ));thendj=\'B\'elif (( $1 > 70 ));thendj=\'C\'elif (( $1 >= 0 ));thendj=\'D\'fi}main(){while :doread -p \"请输入分数\" score#判断输入的分数是数字if echo $score |egrep \"^[0-9]+\\b\" &>/dev/null;then#判断数字是否在0-100之间if (( $score >=0 && $score <=100 ));thenbreakelseecho \"请输入0-100之间的数值\"fi#判断用户输入的是否为空elif [[ $score == \'\' ]];thenecho \"分数长度不为0\"fidonedf $scoreecho \"您的分数是$dj\"}main
运行截图:
3.截取出/etc/passwd文件里面所有的用户名,然后输出hello,用户名
代码如下:
#!/usr/binusername=$( cat /etc/passwd|awk -F: \'{print $1}\')for i in $username:doecho \"hello,${i}\"done
运行截图:
4.扫描局域网内有哪些服务器开放了80和3306端口
要求:
①扫描局域网内开放了80号端口的服务器,将其写入open_web_pc.txt文档中
②扫描局域网内开放了3306号端口的服务器,将其写入open_mysql_pc.txt文档中
代码如下:
#!/usr/bin#!/bin/usr#定义统计80端口和3306端口服务器开启的数量open_80=0open_3306=0>open_web_pc.txt>open_mysql_px.txt#扫描网段192.168.0.1-254,for i in $(seq 254)doif 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.txtopen_80=$(($open_80+1)) #统计量+1elif ncat -z 192.168.0.${i} 3306 &>/dev/null;thenecho \"服务器192.168.0.${i}开启了3306号端口\" >>open_mysql_pc.txtopen_3306=$((open_3306+1))fifidoneecho \"共有$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.txtfor i in $(seq 254)doif ping 192.168.0.${i} -c 1 -i 0.01 &>/dev/null;thenecho \"192.168.0.${i}地址正在使用\" >>ip_up.txtelseecho \"192.168.0.${i}地址未使用\" >>ip_down.txtfidone
运行截图:
查看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位的密码dopd=${pd}${total[(($RANDOM%(${#total[@]})))]}doneecho $pd}>user_ped.txtfor i in {1..10}doread -p \"请输入你的用户名:\" usernamewhile :dogetpdif ! echo $pd | egrep \".*${digit[@]}.*${L_eph[@]}.*${U_eph[@]}.*${symbol[@]}.*\" &>/dev/null;thenecho \"$username $pd\" >>user_ped.txtbreakfidonedone
运行截图:
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));thenecho \"$(date +%Y-%m-%d_%H_%M_%S) $per\" >>/var/log/memory.logfidone
运行截图:
查看日志文件: