zoukankan      html  css  js  c++  java
  • shell学习:几道常见shell习题

    1. 编写shell脚本,计算1-100的和;

    1 #! /bin/bash
    2 sum=0
    3 for i in `seq 1 100`; do
    4 sum=$[$i+$sum]
    5 done
    6 echo $sum
    计算-00和

     

    2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;

     1 #! /bin/bash
     2 n=0
     3 while [ $n -lt "1" ]; do
     4 read -p "Please input a number, it must greater than "1":" n
     5 done
     6 
     7 sum=0
     8 for i in `seq 1 $n`; do
     9 sum=$[$i+$sum]
    10 done
    11 echo $sum
    12 
    13  
    判断输入数字

     

    3. 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下;

    1 #! /bin/bash
    2 for f in `ls /root/`; do
    3 if [ -d $f ] ; then
    4 cp -r $f /tmp/
    5 fi
    6 done
    拷贝目录

     

    4. 编写shell脚本,批量建立用户user_00, user_01, … ,user_100并且所有用户同属于users组;

    1 #! /bin/bash
    2 groupadd users
    3 for i in `seq 0 9`; do
    4 useradd -g users user_0$i
    5 done
    6 
    7 for j in `seq 10 100`; do
    8 useradd -g users user_$j
    9 done
    批量建用户

     

    5. 编写shell脚本,截取文件test.log中包含关键词’abc’的行中的第一列(假设分隔符为”:”),然后把截取的数字排序(假设第一列为数字),然后打印出重复次数超过10次的列;

    1 #! /bin/bash
    2 awk -F':' '$0~/abc/ {print $1}' test.log >/tmp/n.txt
    3 sort -n n.txt |uniq -c |sort -n >/tmp/n2.txt
    4 awk '$1>10 {print $2}' /tmp/n2.txt
    截取文本文件中的字符串

     

    6. 编写shell脚本,判断输入的IP是否正确(IP的规则是,n1.n2.n3.n4,其中1<n1<255, 0<n2<255, 0<n3<255, 0<n4<255

     1 #! /bin/bash
     2 checkip() 
     3 {
     4    if echo $1 |egrep -q '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$' ; then
     5       a=`echo $1 | awk -F. '{print $1}'`
     6       b=`echo $1 | awk -F. '{print $2}'`
     7       c=`echo $1 | awk -F. '{print $3}'`
     8       d=`echo $1 | awk -F. '{print $4}'`
     9    
    10    fi
    11 
    12 for n in $a $b $c $d; do
    13    if [ $n -ge 255 ] || [ $n -le 0 ]; then
    14       echo "the number of the IP should less than 255 and greate than 0"
    15       return 2
    16    else
    17       echo "The IP you input is something wrong, the format is like 192.168.100.1"
    18       return 1
    19    fi
    20 done
    21 
    22 }
    23 
    24 
    25 
    26 rs=1
    27 while [ $rs -gt 0 ]; do
    28    read -p "Please input the ip:" ip
    29    checkip $ip
    30    rs=`echo $?`
    31 
    32 done
    33 
    34 echo "The IP is right!"
    35 判断IP地址
    判断IP地址

    7.编写一个脚本,打印任何数的乘法表。如输入3则打印
      1*1=1
      2*1=2 2*2=4
      3*1=3 3*2=6 3*3=9

    1 awk -vstr='3' 'BEGIN{for(i=1;i<=str;i++){for(p=1;p<=i;p++)printf p"*"i"="p*i"	";printf "
    "}}'
    打印剩法口决


    8.编写一个脚本,输入自己的生日时间(YYYYMMDD),计算还有多少天多少个小时是自己的生日。

     1 read -p "Input your birthday(YYYYmmdd):" date1
     2 m=`date --date="$date1" +%m`   
     3 d=`date --date="$date1" +%d`    
     4 date_now=`date +%s`      
     5 y=`date +%Y`            
     6 
     7 birth=`date --date="$y$m$d" +%s`     
     8 internal=$(($birth-$date_now))       
     9  if [ "$internal" -lt "0" ]; then           
    10      birth=`date --date="$(($y+1))$m$d" +%s`      
    11      internal=$(($birth-$date_now))       
    12  fi
    13 
    14 awk -vinternal=$internal 'BEGIN{d=int(internal/60/60/24);h=int((internal-24*60*60*d)/3600);print "There is : "d" days "h" hours."}'
    计算时间

    9.编写一个脚本,自动将用户主目录下所有小于5KB的文件打包成XX.tar.gz.(提示:用ls,grep,find等命令,文件一般指普通文件)

    1 find ~ -size -5 -type f -maxdepth 1|xargs tar zcvpf backup.tar.gz
    查找文件

     

    10.编写一个程序,他的作用是先查看一下/root/test/logical这个名称是否存在,若不存在,则创建一个文件。使用touch来创建,创建完成后离开;如果存在的话,判断该名称是否为文件,若为文件则将之删除后新建一个目录。文件名为loglical,之后离开;如果存在的话,而且该名称为目录,则删除此目录。

    1 if [ ! -e "/root/test/logical" ]; then touch "hh";  elif [ -f "/root/test/logical" ];then rm /root/test/logical && mkdir logical&&exit;elif  [ -d "/root/test/logical" ];then rm /root/test/logical; fi
    判断文件是否存在

    11.导出 2013-05-24 15:00:00 ~ 2013-05-28 16:00:00 之间的apache访问日志

    1 sed -n '/24/May/2013:15:00:01/,/28/May/2013:16:59:58/p' xxxx-access_log > 20130524.15-20130528.16-access_log
    截取指定范转的内容

    PS:需要注意的是如果起始时间在日志中不存在,则整个截取将返回 0 行结果。而如果结束时间在日志中不存在,则会截取到日志的最后一条。所以在截取前得要找到最日志中最合适的起始点和结束点。
    另一种做法是先使用grep去找到两个点  再使用sed去截取

    1 # 找出 2013-05-24 15点第一条记录的时间[root@style logs]# grep '24/May/2013:15' xxxx-access_log | head -110.200.114.183 - - [24/May/2013:15:00:01 +0800] "GET /gp10/pic_259_218_1368781965.png HTTP/1.0" 401 484# 找出 2013-05-28 16点最后一条记录的时间[root@style logs]# grep '28/May/2013:16' xxxx-access_log | tail -1222.92.115.195 - - [28/May/2013:16:59:58 +0800] "GET /favicon.ico HTTP/1.1" 404 17846# 然后取这两个时间段之间的记录 
    View Code
  • 相关阅读:
    Gradle构建模块化项目
    线程池的理解与应用
    Redis理解
    kafka监听出现的问题,解决和剖析
    shiro利用过期时间,解决用户冻结踢出问题
    信息系统的运行与维护包含的主要内容
    软件维护的内容是什么
    执行顺序
    Chrome/Edge 91版本SameSite by default cookies被移除后的解决方案
    公从号编程
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/4241798.html
Copyright © 2011-2022 走看看