标签:shell习题
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习题-格式化输出
输入一串随机数字,然后按千分位输出。
比如输入数字串为“123456789”,输出为123,456,789
参考答案:
#!/bin/bash read -p "输入一串数字:" num v=`echo $num|sed 's/[0-9]//g'` if [ -n "$v" ] then echo "请输入纯数字." exit fi length=${#num} len=0 sum='' for i in $(seq 1 $length) do len=$[$len+1] if [[ $len == 3 ]] then sum=','${num:$[0-$i]:1}$sum len=0 else sum=${num:$[0-$i]:1}$sum fi done if [[ -n $(echo $sum | grep '^,' ) ]] then echo ${sum:1} else echo $sum fi 上面这个答案比较复杂,下面再来一个sed的 #!/bin/bash read -p "输入一串数字:" num v=`echo $num|sed 's/[0-9]//g'` if [ -n "$v" ] then echo "请输入纯数字." exit fi echo $num|sed -r '{:number;s/([0-9]+)([0-9]{3})/\1,\2/;t number}'
shell习题-检查错误
写一个shell脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接用vim打开该shell脚本。
提醒: 检查shell脚本有没有语法错误的命令是 sh -n xxx.sh
参考答案:
#!/bin/bash sh -n $1 2>/tmp/err if [ $? -eq "0" ] then echo "The script is OK." else cat /tmp/err read -p "Please inpupt Q/q to exit, or others to edit it by vim. " n if [ -z $n ] then vim $1 exit fi if [ $n == "q" -o $n == "Q" ] then exit else vim $1 exit fi fi
shell习题-找出活动ip
写一个shell脚本,把192.168.0.0/24网段在线的ip列出来。
思路: for循环, 0.1 — 0.254 依次去ping,能通说明在线。
参考答案:
#!/bin/bash ips="192.168.1." for i in `seq 1 254` do ping -c 2 $ips$i >/dev/null 2>/dev/null if [ $? == 0 ] then echo "echo $ips$i is online" else echo "echo $ips$i is not online" fi done
shell习题-日志归档
类似于日志切割,系统有个logrotate程序,可以完成归档。但现在我们要自己写一个shell脚本实现归档。
举例: 假如服务的输出日志是1.log,我要求每天归档一个,1.log第二天就变成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5
参考答案:
#!/bin/bash function e_df() { [ -f $1 ] && rm -f $1 } for i in `seq 5 -1 2` do i2=$[$i-1] e_df /data/1.log.$i if [ -f /data/1.log.$i2 ] then mv /data/1.log.$i2 /data/1.log.$i fi done e_df /data/1.log.1 mv /data/1.log /data/1.log.1
shell习题-shell的getops
2017年9月7日
shell习题
No Comments
aming
写一个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时)
参考答案:
shell习题