分类:shell习题
shell习题-判断日期是否合法
用shell脚本判断输入的日期是否合法。就是判断日期是都是真实的日期,比如20170110就是合法日期,20171332就不合法。
参考答案:
#!/bin/bash #check date if [ $# -ne 1 ] || [ ${#1} -ne 8 ] then echo "Usage: bash $0 yyyymmdd" exit 1 fi datem=$1 year=${datem:0:4} month=${datem:4:2} day=${datem:6:2} if echo $day|grep -q '^0' then day=`echo $day |sed 's/^0//'` fi if cal $month $year >/dev/null 2>/dev/null then daym=`cal $month $year|egrep -v "$year|Su"|grep -w "$day"` if [ "$daym" != "" ] then echo ok else echo "Error: Please input a wright date." exit 1 fi else echo "Error: Please input a wright date." exit 1 fi
shell习题-检查服务
先判断是否安装http和mysql,没有安装进行安装,安装了检查是否启动服务,若没有启动则需要启动服务。
说明:操作系统为centos6,httpd和mysql全部为rpm包安装。
参考答案:
#!/bin/bash if_install() { n=`rpm -qa|grep -cw "$1"` if [ $n -eq 0 ] then echo "$1 not install." yum install -y $1 else echo "$1 installed." fi } if_install httpd if_install mysql-server chk_ser() { p_n=`ps -C "$1" --no-heading |wc -l` if [ $p_n -eq 0 ] then echo "$1 not start." /etc/init.d/$1 start else echo "$1 started." fi } chk_httpd chk_mysqld
shell习题-3位随机数字
写一个脚本产生随机3位的数字,并且可以根据用户的输入参数来判断输出几组。 比如,脚本名字为 number3.sh。
执行方法:
bash number3.sh
直接产生一组3位数字。
bash number3.sh 10
插上10组3位数字。
思路: 可以使用echo $RANDOM获取一个随机数字,然后再除以10,取余获取0-9随机数字,三次运算获得一组。
参考答案
#!/bin/bash get_a_num() { n=$[$RANDOM%10] echo $n } get_numbers() { for i in 1 2 3; do a[$i]=`get_a_num` done echo ${a[@]} } if [ -n "$1" ]; then m=`echo $1|sed 's/[0-9]//g'` if [ -n "$m" ]; then echo "Useage bash $0 n, n is a number, example: bash $0 5" exit else for i in `seq 1 $1` do get_numbers done fi else get_numbers fi
shell习题-shell的getops
写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务:
1)使用一下形式:getinterface.sh [-i interface | -I ip]
2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项时,显示其指定ip所属的网卡。
例:sh getinterface.sh -i eth0
sh getinterface.sh -I 192.168.0.1
3)当用户使用除[-i | -I]选项时,显示[-i interface | -I ip]此信息。
4)当用户指定信息不符合时,显示错误。(比如指定的eth0没有,而是eth1时)
参考答案:
#!/bin/bash ip add |awk -F ":" '$1 ~ /^[1-9]/ {print $2}'|sed 's/ //g' > /tmp/eths.txt [ -f /tmp/eth_ip.log ] && rm -f /tmp/eth_ip.log for eth in `cat /tmp/eths.txt` do ip=`ip add |grep -A2 ": $eth" |grep inet |awk '{print $2}' |cut -d '/' -f 1` echo "$eth:$ip" >> /tmp/eth_ip.log done useage() { echo "Please useage: $0 -i 网卡名字 or $0 -I ip地址" } wrong_eth() { if ! awk -F ':' '{print $1}' /tmp/eth_ip.log | grep -qw "^$1$" then echo "请指定正确的网卡名字" exit fi } wrong_ip() { if ! awk -F ':' '{print $2}' /tmp/eth_ip.log | grep -qw "^$1$" then echo "请指定正确的ip地址" exit fi } if [ $# -ne 2 ] then useage exit fi case $1 in -i) wrong_eth $2 grep -w $2 /tmp/eth_ip.log |awk -F ':' '{print $2}' ;; -I) wrong_ip $2 grep -w $2 /tmp/eth_ip.log |awk -F ':' '{print $1}' ;; *) useage exit esac
shell习题-判断pid是否一致
先普及一小段知识,我们用ps aux可以查看到进程的PID,而每个PID都会在/proc内产生。如果查看到的pid而proc内是没有的,则是进程被人修改了,这就代表你的系统很有可能已经被入侵过了。
请大家用上面知识编写一个shell,定期检查下自己的系统是否被人入侵过。
参考答案:
#!/bin/bash ps aux|awk '/[0-9]/ {print $2}'|while read pid do result=`find /proc/ -maxdepth 1 -type d -name "$pid"` if [ -z $result ]; then echo "$pid abnormal!" fi done
shell习题-更改后缀名
1 编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。
2 编写一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。
参考答案:
1 #!/bin/bash find . -type f -name "*.txt" > /tmp/txt.list for f in `cat /tmp/txt.list` do n=`echo $f|sed -r 's/(.*)\.txt/\1/'` echo "mv $f $n.doc" done 2 #!/bin/bash read -p "Please input the username: " user while : do if who | grep -qw $user then echo $user login. else echo $user not login. fi sleep 300 done
shell习题-判断用户登录
1 编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。
2 编写一个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。
参考答案:
1. #!/bin/bash read -p "Please input the username: " user if who | grep -qw $user then echo $user is online. else echo $user not online. fi 2. #!/bin/bash function message() { echo "0. w" echo "1. ls" echo "2.quit" read -p "Please input parameter: " Par } message while [ $Par -ne '2' ] ; do case $Par in 0) w ;; 1) ls ;; 2) exit ;; *) echo "Unkown command" ;; esac message done
shell习题-判断文件存在
1 编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在?
2 编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
参考答案:
1 #!/bin/bash if [ -f /bin/date ] then echo "/bin/date file exist." else echo "/bin/date not exist." fi 2 #!/bin/bash h=`date +%H` if [ $h -ge 0 ] && [ $h -lt 12 ] then echo "Good morning." elif [ $h -ge 12 ] && [ $h -lt 18 ] then echo "Good afternoon." else echo "Good evening." fi
shell习题-监控网卡
2017年9月13日
shell习题
No Comments
aming
1 每10分钟检测一次指定网卡的流量
2 如果流量为0,则重启网卡
参考答案: