• shell编程练习(二): 笔试11-20


    笔试练习(二):

    11、写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录。

    [root@VM_0_5_centos test]# vi 11.sh
    [root@VM_0_5_centos test]# cat 11.sh 
    #!/bin/bash 
    echo "Hello, $LOGNAME" 
    echo "Current date is `date`" 
    echo "User is `who i am`" 
    echo "Current directory `pwd`"
    [root@VM_0_5_centos test]# sh 11.sh Hello, root Current date is Tue Jul 24 11:35:23 CST 2018 User is root pts/0 2018-07-24 11:34 (222.211.249.187) Current directory /test

    12、编写shell脚本获取本机的网络地址。

    [root@VM_0_5_centos ~]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.27.0.5  netmask 255.255.240.0  broadcast 172.27.15.255
            ether 52:54:00:34:12:97  txqueuelen 1000  (Ethernet)
            RX packets 18464043  bytes 1387072767 (1.2 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1111041544  bytes 1128965265141 (1.0 TiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1  (Local Loopback)
            RX packets 343083420  bytes 34242325784 (31.8 GiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 343083420  bytes 34242325784 (31.8 GiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    [root@VM_0_5_centos test]# vi 12.sh
    [root@VM_0_5_centos test]# cat 12.sh 
    #!/bin/bash
    #This script print ip and network
     
    IP=`ifconfig eth0 | grep 'inet ' | sed 's/^.*inet//g'| sed 's/ netmask.*$//g'`
    NETMASK=`ifconfig eth0 | grep 'inet '| sed 's/^.*netmask//g' | sed 's/broadcast.*$//g'` 
    echo "IP is $IP"
    echo "NETMASK is $NETMASK"
    exit 0
    
    [root@VM_0_5_centos test]# sh 12.sh 
    IP is  172.27.0.5 
    NETMASK is  255.255.240.0 

    13、编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下:

    [root@VM_0_5_centos test]# vi 13.sh
    [root@VM_0_5_centos test]# cat 13.sh
    #/bin/bash
    
    # Using for move currently directory lt 10k file to /tmp
     
    for FileName in `ls -l | awk '$5>10240 {print $9}'`; do
        mv $FileName /tmp
    done
     
    ls -al /tmp
     
    echo "Done! "

    14、编写一个名为myfirstshell.sh的脚本,它包括以下内容:

    a) 包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。
    b) 问候用户。
    c) 显示日期和时间。
    d) 显示这个月的日历。
    e) 显示您的机器名。
    f) 显示当前这个操作系统的名称和版本。
    g) 显示父目录中的所有文件的列表。
    h) 显示root正在运行的所有进程。
    i) 显示变量TERM、PATH和HOME的值。
    j) 显示磁盘使用情况。
    k) 用id命令打印出您的组ID。
    m) 跟用户说“Good bye”
    [root@VM_0_5_centos test]# vi 14.sh
    [root@VM_0_5_centos test]# cat 14.sh
    #!/bin/bash
    
    user=`whoami`
    case $user in
        root)
            echo "hello root";;
        mmzs)
            echo "hello mmzs";;
        *)
            echo "hello $user,welcome"
    esac
    
    echo "日期和时间: `date`"
    echo "本月的日历: `cal`"
    echo "本机的机器名:`uname -n`"
    echo "当前这个操作系统的名称和版本:`uname -s;uname -r`"
    echo "变数TERM的值:$TERM"
    echo "变数PATH的值:$PATH"
    echo "变数HOME的值:$HOME"
    echo "磁盘的使用情况:`df`"
    echo "用id命令打印出你的组ID:`id -g`"
    echo "root正在运行的所有进程:` ps -u root`"
    echo "父目录中的所有文件的列表:`ls ../`"
    echo "Good bye!"
    exit 0
    
    [root@VM_0_5_centos test]# sh 14.sh 
    hello root
    日期和时间: Thu Jul 26 14:40:40 CST 2018
    本月的日历:       July 2018     
    Su Mo Tu We Th Fr Sa
     1  2  3  4  5  6  7
     8  9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30 31
    本机的机器名:VM_0_5_centos
    当前这个操作系统的名称和版本:Linux
    3.10.0-693.el7.x86_64
    变数TERM的值:xterm
    变数PATH的值:/usr/local/mongodb3.0.6/bin:/usr/local/node/8.11.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/software/jdk1.7.0_79/bin:/software/jdk1.7.0_79/lib:/root/bin
    变数HOME的值:/root
    磁盘的使用情况:Filesystem     1K-blocks     Used Available Use% Mounted on
    /dev/vda1       51474024 45832784   3335164  94% /
    devtmpfs          932328        0    932328   0% /dev
    tmpfs             941808       24    941784   1% /dev/shm
    tmpfs             941808      384    941424   1% /run
    tmpfs             941808        0    941808   0% /sys/fs/cgroup
    tmpfs             188364        0    188364   0% /run/user/0
    用id命令打印出你的组ID:0
    root正在运行的所有进程:  PID TTY          TIME CMD
        1 ?        00:00:15 systemd
        2 ?        00:00:00 kthreadd
        3 ?        00:02:05 ksoftirqd/0
        5 ?        00:00:00 kworker/0:0H
    ……等等
    
    父目录中的所有文件的列表:bin
    boot
    data
    dev
    etc
    home
    install
    lib
    lib64
    opt
    proc
    root
    run
    sbin
    ……等等
    
    Good bye!

    15、文件移动拷贝,有m1.txt m2.txt m3.txt m4.txt,分别创建出对应的目录,m1 m2 m3 m4 并把文件移动到对应的目录下。

    [root@VM_0_5_centos test]# vi 15.sh
    [root@VM_0_5_centos test]# cat 15.sh 
    #!/bin/bash
    touch m1.txt m2.txt m3.txt m4.txt
    I=1 
    
    while [ $I -le 4 ]; do 
        mkdir m$I
        mv m$I.txt m$I
        I=$((I+1))
    done
    
    [root@VM_0_5_centos test]# sh 15.sh 
    [root@VM_0_5_centos test]# ll
    total 32
    -rw-r--r-- 1 root root  128 Jul 26 14:05 11.sh
    -rw-r--r-- 1 root root  271 Jul 26 14:15 12.sh
    -rw-r--r-- 1 root root  635 Jul 26 14:40 14.sh
    -rw-r--r-- 1 root root  131 Jul 26 15:03 15.sh
    drwxr-xr-x 2 root root 4096 Jul 26 15:03 m1
    drwxr-xr-x 2 root root 4096 Jul 26 15:03 m2
    drwxr-xr-x 2 root root 4096 Jul 26 15:03 m3
    drwxr-xr-x 2 root root 4096 Jul 26 15:03 m4
    [root@VM_0_5_centos test]# cd m1/
    [root@VM_0_5_centos m1]# ll
    total 0
    -rw-r--r-- 1 root root 0 Jul 26 15:03 m1.txt

    16、root用户今天登陆了多长时间?

    [root@VM_0_5_centos m1]# vi 16.sh 
    [root@VM_0_5_centos m1]# cat 16.sh 
    #! /bin/sh
    
    cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒
    ",run_days,run_hour,run_minute,run_second)}'
    [root@VM_0_5_centos m1]# sh 16.sh 
    系统已运行:1天21时53分19秒

    17、终端输入一个文件名,判断是否是设备文件?

    [root@VM_0_5_centos test]# vi 17.sh
    [root@VM_0_5_centos test]# cat 17.sh 
    #/bin/bash
    
    echo -e "The program will Judge a file is or not a device file.
    
    "
    read -p "Input a filename:" filename
    if [ -b $filename -o -c $filename ]; then
        echo "$filename is a device file"
        exit 0
    else
        echo "$filename is not a device file"
        exit 1
    fi

    18、统计IP访问:要求分析apache访问日志,找出访问页面数量在前100位的IP数。日志大小在78M左右。

    以下是apache的访问日志节选:

    202.101.129.218 - - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
    [root@VM_0_5_centos test]# mkdir -p 18
    [root@VM_0_5_centos test]# mv 18.sh access.log 18
    [root@VM_0_5_centos test]# cd 18
    
    [root@VM_0_5_centos 18]# vi 18.sh 
    [root@VM_0_5_centos 18]# cat 18.sh 
    #! /bin/bash
    
    # $1 为要测试的日志文件
    awk '{print $1}' $1 | sort | uniq -c | sort -k1nr | head -n3
    [root@VM_0_5_centos 18]# ll
    total 20
    -rw-r--r-- 1 root root   108 Aug  6 14:58 18.sh
    -rw-r--r-- 1 root root 14372 May 20  2015 access.log
    [root@VM_0_5_centos 18]# cat access.log 
    192.168.1.108 - - [23/Dec/2014:06:56:49 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
    省略更多访问记录……
    
    [root@VM_0_5_centos 18]# sh 18.sh access.log 
         34 127.0.0.1
         16 192.168.1.108
         13 192.168.6.254
    [root@VM_0_5_centos 18]# 

    19、设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

    [root@VM_0_5_centos test]# mkdir -p 19
    [root@VM_0_5_centos test]# cd 19
    [root@VM_0_5_centos 19]# vi 19.sh
    [root@VM_0_5_centos 19]# cat 19.sh 
    #!/bin/bash
    # 需要root权限
    echo "create /test/19/tset"
    #为方便测试,将/userdata目录修改为/test/19/tset
    mkdir /test/19/tset
    
    if [ $? -eq 0 ]; then
        i=1
        while [ $i -le 50 ]; do
            mkdir -p /test/19/test/user$i
            chmod 754 /test/19/test/user$i
            let i++
        done
    else
        echo "bye"
        exit 1
    fi
    
    exit 0
    
    
    [root@VM_0_5_centos 19]# sh 19.sh 
    create /usrdata
    [root@VM_0_5_centos 19]# cd /test/19/test
    [root@VM_0_5_centos test]# ll
    total 200
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user1
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user10
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user11
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user12
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user13
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user14
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user15
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user16
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user17
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user18
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user19
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user2
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user20
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user21
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user22
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user23
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user24
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user25
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user26
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user27
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user28
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user29
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user3
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user30
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user31
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user32
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user33
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user34
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user35
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user36
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user37
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user38
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user39
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user4
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user40
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user41
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user42
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user43
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user44
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user45
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user46
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user47
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user48
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user49
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user5
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user50
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user6
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user7
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user8
    drwxr-xr-- 2 root root 4096 Aug  6 15:03 user9
    [root@VM_0_5_centos test]# 

    20、设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30,并设置密码为对应的stdxx。

    [root@VM_0_5_centos test]# vi 20.sh
    [root@VM_0_5_centos test]# cat 20.sh 
    #!/bin/bash
    #设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。
    #请 su root  或者 sudo su  变成root用户
    
    groupadd class1
    for i in {9901..9930}; do
        xx=`echo $i | sed 's/99//g'`
        useradd -g class1 -s /bin/bash -d /home/std$xx -m std$xx
        echo -e "std$xx
    std$xx" | passwd std$xx 
        echo -e "user std$xx password is std$xx" >> /root/newuser.txt
    done

    获取脚本

    注:所有脚本均可通过关注右侧公众号,后台回复"shell编程练习"获取百度网盘链接。

  • 相关阅读:
    微信企业号-上传、获取临时素材文件
    微信企业号-身份验证
    【转】android 电池(三):android电池系统
    【转】android 电池(二):android关机充电流程、充电画面显示
    【转】android 电池(一):锂电池基本原理篇
    【转】android 物理按键
    【转】android 电容屏(三):驱动调试之驱动程序分析篇
    【转】android 电容屏(二):驱动调试之基本概念篇
    【转】android 电容屏(一):电容屏基本原理篇
    名言警句
  • 原文地址:https://www.cnblogs.com/mmzs/p/9361247.html
Copyright © 2020-2023  润新知