shell练习

来源:互联网 发布:mysql while do 编辑:程序博客网 时间:2024/06/01 23:27

问题1:使用for循环在/oldboy目录下批量创建10个文件,名称依次为: oldboy-1 oldboy-2 oldboy-3 …………. oldboy-10

for aa in {1..10};do  [ ! -d /oldboyshell ] && mkdir -p /oldboyshell >& /dev/null  touch /oldboyshell/oldboy-$aadone

>& /dev/null  http://blog.csdn.net/lizhi200404520/article/details/7270151

 mkdir -p mkdir的-p选项允许你一次性创建多层次的目录,而不是一次只创建单独的目录
&> 等如 2>&1 , > 等于 1> 1 是 STDOUT, 2 是 STDERR, 2>&1 就是 STDOUT和 STDERR,指将标准信息输出路径指定为错误信息输出路径,即所有错误信息显示在终端上


问题2:将以上文件名中的oldboy全部改成linux(用for循环实现):

for bb in {1..10};do  mv /oldboyshell/oldboy-$bb /oldboyshell/linux-$bb #mv /usr/lib/* /001 是将 /usr/lib/下所有的东西移到/001/中done


另一种方法:把linux改回oldboy-*。

#!/bin/bash cd /oldboyshell for dd in `/bin/ls linux*`;do     mv $dd `echo $dd | sed 's#linux#oldboy#g'` done

知识点

  1. (1)sed 's/^My/You/g' datafile  
  2. #命令末端的g表示在行内进行全局替换,也就是说如果某行出现多个My,所有的My都被替换为You。  
  3.   
  4. (2)sed -n '1,20s/My$/You/gp' datafile  
  5. #取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上。  
  6.   
  7. (3)sed 's#My#Your#g' datafile  
  8. #紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。

把用户名设置为密码:

for p in `seq -w 1 10`;do  useradd oldboy$p && echo "oldboy$p" | passwd --stdin oldboy$pdone

删除用户

#!/bin/bashfor p in `seq -w 10`;do   userdel -r oldboy$p  #userdel -r把用户的家目录及本地邮件存储的目录或文件也一同删除  -f强制删除done  

seq命令用于产生从某个数到另外一个数之间的所有整数。

-f, --format=格式 使用printf 样式的浮点格式 
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n) 
-w, --equal-width 在列前添加0 使得宽度相同



问题5:写一个脚本,实现判断192.168.1.0/24网络里,当前在线用户的IP有哪些?

for i in `seq 254`;do                    #ping -c2 ping两次  ping -c2 192.168.1.$i > /dev/null 2>&1 #将标准输出重定向到/dev/null,标准错误等同于标准输出,即丢弃你的标准输出和错误输出  if [ $? -eq 0 ];then    echo "192.168.1.$i is up" >> /tmp/uplist.log  else    echo "192.168.1.$i is down" >> /tmp/downlist.log  fidone


问题6:写一个脚本解决DOS攻击生产案例,提示:可根据web日志或者网络连接数,监控当某个IP并发连接数或者短时内PV达到20时(PV-page view,即页面浏览量),即调用防火墙命令封掉对应的IP,监控频率每隔5秒钟。

iptables详解

awk详解

sort命令

exec详解



问题9:bash for循环打印下面这句话中字母不大于6的单词。 I am oldboy teacher welcome to oldboy training class. 

1.  wc -L打印最长行的长度

2.${#str}字符传长度变量

3.expr length

4.awk

for bb in i am oldboy teacher welcome to oldboy training class;do   [ ${#bb} -le 6 ] && echo $bbdone

for bb in i am oldboy teacher welcome to oldboy training class;do   [ `expr length "$bb"` -le 6 ] && echo $bbdone

for bb in i am oldboy teacher welcome to oldboy training class;do   [ `echo $bb | wc -L` -le 6 ] && echo $bbdone

问题10:用shell把文件(假设一共51行)特定行打印出来,比如第一行、第十一行、第二十一行、第三十一行、第四十一行和第五十一行。

sed

for t in `seq 1 10 60`;do   sed -n ${t}p access.logdone  

for t in `seq 1 10 60`;do  cat -n test.txt | sed -n ${t}p   #cut  -n 或 --number 由 1 开始对所有输出的行数编号done

检查/etc/passwd文件是否存在,若存在则统计文件内容的行数并输出,否则不做任何操作: 

epd="/etc/passwd"if [ -f $epd ];then  wc -l $epdfi

提示用户指定备份目录的路径,若目录已存在则显示信息后跳过,否则显示相应提示信息后创建该目录:

read -p "backdir address": bakdirif [ -d $bakdir ];then   echo "$bakdir already exists"else   echo "$bakdir is not exists, make one."   mkdir $bakdirfi

统计当前登录系统到系统中的用户数量,并判断是否超过三个,若是则显示实际数量并给出警告信息,否则列出登陆的用户账号名称及所在终端:

#!/bin/bashun='who' | wc -lif [ $un -gt 3 ];then  echo "warning: too much users.(total: $un)"else  echo "login users:"  who | awk '{print $1,$2}'fi

检查portmap进程是否已经存在,若已经存在则输出“portmap service is running”;否则检查是否存在/etc/rc.d/init.d/portmap可执行脚本,存在则启动portmap服务,否则提示“no portmap”:

pgrep

由用户从键盘输入一个字符,并判断该字符是否为字母,数字或者其他字符,并输出相应的提示信息。

#!/bin/bashread -p "please enter a character:" KEYcase "$KEY" in   [a-z] | [A-Z])      echo "It's a letter."   ;;   [0-9] )     echo "it's a number"   ;;   *)     echo "not valid input"esac

编写一个shell程序,计算多个整数值的和,需要计算的各个数值由用户在执行脚本时作为命令行参数给出。

#!/bin/bashresult=0while [ $# -gt 0 ];do   result=`expr $result + $1`   shiftdoneecho "the sum is $result"
$# 这个程式的参数个数
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。

bash sumer.sh 1 2 3 4 5


        在使用for,while或until循环语句以及case分支语句的过程中,当满足特定的条件时可能会需要中断循环体的执行,或者需要直接跳转到开头重新判断测试条件(而不再执行后边的命令序列)。这时候,可以使用break和continue语句对执行流程进行控制。

 
      循环提示用户输入字符串,并将每次输入的内容保存到临时文件“/tmp/input.txt”中,当用户输入“END”字符串时退出循环体,并统计出input.txt文件中的行数,单词数,字节数等信息,统计完后删除临时文件。

#!/bin/bashwhile true;do   read -p "input a string": str   echo $str >>/tmp/input.txt   if [ "$str" = "END" ];then     break   fidonewc /tmp/input.txt #默认请款下统计指定文件中的行数、字数,以及字节数rm -f /tmp/imput.txt

字符串比较 

=       等于,如:if [ "$a" = "$b" ] 

==       等于,如:if [ "$a" == "$b" ],与=等价 


在脚本中定义一个help函数,当用户输入的脚本参数不是“start”或“stop”时,加载该函数并给出关于命令用法的帮助信息,否则给出对应的提示信息。

#!/bin/bashhelp(){   echo "Usage:$0 start|stop "}case $1 in   start)     echo "starting..."   ;;   stop)     echo "shutdown"   ;;    *)help  #d调用函数esac

写一个脚本,判断当前系统是否有用户的默认shell为bash; 如果有,就显示有多少个这类用户,否则,就显示没有这类用户;

#!/bin/bashgrep "bash$" /etc/passwd >&/dev/nullRETVAL=$?if [ $RETVAL -eq 0 ];then   grep "bash$" /etc/passwd | wc -lelse   echo "no such user"fi


grep 如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。

正则表达式


0 0
原创粉丝点击