• shell --08 例子


    目录

    1.按照时间生成文件2018-05-22.log将每天的磁盘使用状态写入到对应日期的文件

    [root@web01 ceshi]# cat 1.sh 
    #!/bin/bash
    Date=`date +%F`
    dir=/backup
    [ -d $dir ] || mkdir -p $dir
    df -h >${dir}/$Date.log
    

    2. 统计Nginx日志中每个IP的访问量有多少,日志如下:

    [root@web01 ~]# awk '{ip[$1]++} END {for(i in ip){print i,ip[i]}}' access_(1).log |sort -rnk2 |head|column -t
    
    [root@web01 ceshi]# cat 2.sh 
    #!/usr/bin/bash
    declare -A access
    
    while read line
    do
        type=$(echo $line|awk '{print $1}')
        let access[$type]++
    done < /root/driverzeng.com_access.log
    
    for i in ${!access[@]}
    do
        echo " ip是:$i 出现次数是 :${access[$i]}"
    done
    
    

    3.在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件

    ​ 1.批量修改txt为txt.bak

    ​ 2.把所有的.bak文件打包压缩为123.tar.gz

    ​ 3.批量还原文件的名字,及把增加的.bak再删除

    [root@web01 ceshi]# cat 3.sh 
    #!/bin/bash
    dir=/backup
    #1.判断目录是否存在,不存在则创建
    [ -d $dir ] || mkdir -p $dir
    #创建10个文件
    touch $dir/{1..10}.txt
    #批量修改文件名
    find $dir -type f -name "*.txt" >$dir/txt.log
    #2.使用for循环进行修改名
    for i in $(cat $dir/txt.log)
    do
        mv $i $i.bak
    done
    #3.打包压缩
    tar czf $dir/123.tar.gz  $dir/*.bak
    #4.批量还原
    find $dir -type f -name "*.bak" > $dir/bak.log
    for j in $(cat $dir/bak.log)
    do
        mv $j ${j%.*}
    done
    
    

    4.输入两个整数计算这两个整数的相加,相减,相乘,相除,求余的结果

    [root@web01 ceshi]# cat 4.sh 
    #!/bin/bash
    read -p "请输入第一个数字: " num1
    read -p "请输入第二个数字: " num2
    
    echo "$num1 + $num2 = $[$num1+$num2]"
    echo "$num1 - $num2 = $[$num1-$num2]"
    echo "$num1 x $num2 = $[$num1*$num2]"
    echo "$num1 ÷ $num2 = $[$num1/$num2]"
    echo "${num1}和${num2}的余是: $[$num1%$num2]"
    

    5.打印下面这句话中字母数小于5的单词** **I am lizhenya teacher I am 18

    方法一:
    [root@web01 ceshi]#  echo "I am lizhenya teacher I am 18"|xargs -n1|awk '{if(length < 5)print}'
    I
    am
    I
    am
    18
    方法二:
    [root@web01 ceshi]# cat 5.sh 
    #!/bin/bash
    length='I am lizhenya teacher I am 18'
    
    for i in $length
    do
            [ ${#i} -lt 5 ] && echo $i
        done
    

    6. 写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10

    [root@web01 ceshi]# cat 6.sh 
    #!/bin/bash
    HISTFILE=~/.bash_history
    set -o history
    history |awk '{print $2}'|sort|uniq -c|sort -rn|head 
    
    

    7. 将下面的条件表达式改写为if条件语句** [ -f /etc/hosts ] && echo !

    [root@web01 ceshi]# cat 7.sh 
    #!/bin/bash
    if [ -f /etc/hosts ];then 
        echo !
    fi
    

    8.写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些**

    方法一:
    [root@web01 ceshi]# cat 8.sh 
    #!/bin/bash
    for i in {1..254}
    do
        {
        ping -W1 -c1 10.0.0.$i &>/dev/null 
        rc=$?
        if [ $rc -eq 0 ];then
            echo -e "33[32m 10.0.0.$i 存在 33[0m"
        else
            echo -e "33[31m 10.0.0.$i 不存在 33[0m"
        fi
    }&
    done
    
    方法二:
    [root@web01 ceshi]# cat 8-2.sh 
    #!/bin/bash
    source /etc/init.d/functions
    
    for i in {1..254}
    do
        {
        ping -W1 -c1 10.0.0.$i &>/dev/null
        if [ $? -eq 0 ];then
        action "IP 10.0.0.$i 通" /bin/true
        else
        action "IP 10.0.0.$i 不通" /bin/false &>/dev/null
        fi
        } &
        sleep 0.01                                                                                                          
    done
    
    

    9.写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常

    [root@web01 ceshi]# cat 9.sh 
    #!/bin/bash
    read -p "请输入网址:  " address
    state=`curl -sI $address | awk 'NR==1{print $2}'`
    if ((state==200));then 
        echo -e  "33[32m $address 网站正常33[0m"
    else
        echo -e  "33[31m $address 无法连接33[0m"
    fi
    
    

    10.用Shell实现,把一个文本文档中只有一个数字的行给打印出来

    [root@web01 ceshi]# cat 10.sh 
    #!/bin/bash
    read -p "请输入要测试的文件: " cc
    aa=`cat $cc|wc -l`
    for i in `seq $aa`                                 
    do
        lenth=`sed -n "$i"p  $cc |sed s#[^0-9]##g|wc -L`
        if [[ $lenth = 1 ]];then
            sed -n "$i"p $cc
        fi
    done
    
    

    11.查看磁盘/当前使用状态,如果使用率超过80%则把结果输出到/var/log/disk.err

    [root@web01 ceshi]# cat 11.sh
    #!/bin/bash
    date=`date +%F`
    use=`df -h|awk 'NR==2{print $(NF-1)}'`
    if [ ${use/\%/} -lt 80 ];then
        echo "${date}磁盘/使用率正常! 使用率为$use"
    else
        echo "${date}磁盘/使用率不正常! 使用率为$use" >>/var/log/disk.err
    fi
    

    12.脚本用read批量创建10个用户,密码统一为123,需要对用户输入是否为数字和输入的名字是否为空做判断

    [root@web01 ceshi]# cat 12.sh 
    #!/usr/bin/bash
    read -p "请输入你要创建的用户前缀: " user
    if [ -z $user ];then
        echo "请输入有效的值.....再见"
        exit
    elif [[ $user =~ ^[0-9]+$ ]];then
        echo "你输入的是数字...再见 "
        exit
    else
        continue
    fi
    
    for i in `seq 10`
    do
        user_name=${user}${i}
        useradd $user${i}
        echo "用户: ${user}${i} 已创建" 
        echo "123" | passwd --stdin $user${i} &>/dev/null
    done
    

    13.使用case语句编写php-fpm启动脚本

    [root@web01 ceshi]# vim  13.sh
    . /etc/rc.d/init.d/functions  
    
    . /etc/sysconfig/network  
    
    [ "$NETWORKING" = "no" ] && exit 0  
    
    phpfpm="/usr/local/php-5.3.10/sbin/php-fpm"  
    prog=$(basename ${phpfpm})  
    
    lockfile=/var/lock/subsys/phpfpm
    
    start() {  art
        [ -x ${phpfpm} ] || exit 5  
        echo -n $"Starting $prog: "  
        daemon ${phpfpm}
        retval=$?  
        echo  
        [ $retval -eq 0 ] && touch $lockfile  
        return $retval  
    }  
    
    stop() {  
        echo -n $"Stopping $prog: "  
        killproc $prog -QUIT  
        retval=$?  
        echo  
        [ $retval -eq 0 ] && rm -f $lockfile  
        return $retval  
    }  
    
    restart() {  
        configtest || return $?  
        stop  
        start  
    }  
    
    reload() {  
        configtest || return $?  
        echo -n $"Reloading $prog: "  
        killproc ${phpfpm} -HUP  
        RETVAL=$?  
        echo  
    }  
    
    force_reload() {  
        restart  
    }  
    
    configtest() {  
        ${phpfpm} -t
    }  
    
    rh_status() {  
        status $prog  
    }  
    
    rh_status_q() {  
        rh_status >/dev/null 2>&1  
    }  
    
    case "$1" in  
        start)  
            rh_status_q && exit 0  
            $1  
            ;;  
        stop)  
            rh_status_q || exit 0  
            $1  
            ;;  
        restart|configtest)  
            $1  
            ;;  
        reload)  
            rh_status_q || exit 7  
            $1  
            ;;  
        status)  
            rh_status  
            ;;  
        *)  
            echo $"Usage: $0 {start|stop|status|restart|reload|configtest}"  
            exit 2  
    esac
    
    

    14.打印一个菜单如下,然后用循环加case语句输出用户输入菜单选项的结果(8分)

    h 显示命令帮助

    f 显示登陆信息

    d 显示磁盘挂载

    m 查看内存使用

    u 查看系统负载

    q 退出程序

    [root@web01 ceshi]# cat 14.sh 
    #!/bin/bash
    menu(){
        cat<<EOF
    ----------------------
           菜单        
    ----------------------
    h  显示命令帮助 
    ----------------------
    f  显示登录的信息  
    ----------------------
    d  显示磁盘挂载 
    ----------------------
    m  查看内存使用  
    ----------------------
    u  查看系统负载
    ----------------------
    q  退出程序     
    ----------------------
    EOF
    }
    menu
    while true  
    do
        read -p "请输入序号来执行对应: "  aaa
        case $aaa in
            h)
                menu
                ;;
            f)
                whoami
                ;;
            d)
                df -h
                ;;
            m)
                free -m
                ;;
            u)
                w
                ;;
            q)
                exit
                ;;
            *)
                echo "傻子,输错了...!"
                ;;
        esac
    done
    

    15.生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果

    [root@web01 ceshi]# cat 15.sh
    #!/bin/bash
    while true
    do 
    	ran=`echo $((RANDOM%100+1))`
    	sum=$(($sum+$ran))
    	if [ $sum -gt 1000 ]
    	then
        echo "结果为 $sum"
    	break
    	fi
    done
    

    16.判断/tmp目录下是否有大于4k的文件,如果有则输出该文件的大小与创建时间

    [root@web01 ceshi]# cat 16.sh 
    #!/bin/bash
    wenjian=`find /tmp -type f -size +4k `
    for i in $wenjian
    do
        if [ -f $i ];then
            echo "$(ls -l $wenjian|awk '{print $5,$6,$7,$8,$NF}')"
        else
            echo "exit"
        fi
    done  
    

    17.检测服务器中重要的文件是否被修改吗如果被修改则报警(使用指纹)

    [root@web01 ceshi]# cat 17.sh 
    #!/binbash
    md5sum /root/file > /root/md5sum
    while true
    do
        md5sum -c /root/md5sum &>/dev/null
        if (( $?==0 ));then 
            echo "文件正常"
            sleep 10
        else 
            echo "文件修改了"
            sleep 10
        fi
    done
    

    18.防止DOS攻击(检测nignx日志若某个IP短时间的PV过大则使用防火墙将其禁掉)

    1.根据日志提取ip和pv数,或者根据网络连接数提ip和pv
    2.判断当pv大于你所能接受的最大值时,把此ip加入防火墙中
    3.可以结合crontab实现每3分钟执行一次
    
    

    19.if 判断分数大于等于90分的为优秀,大于等于70的为良好,大于等于60的为及格否则不及格 数字不能为空 最大分数为100分。

    [root@web01 ceshi]# vim 19.sh 
    #!/bin/bash
    read -p "请输入你的分数: " fs
    if [ $fs -gt 0 -a $fs -lt 60 ];then
        echo "补考"
    elif [ $fs -ge 60 -a $fs -lt 70 ];then
        echo "合格"
    elif [ $fs -ge 70 -a $fs -le 90 ];then
        echo "良好"
    elif [ $fs -ge 90 -a $fs -le 100 ];then
        echo "优秀"
    else
        echo "顽皮"
    fi
    

    20.判断软件包是否安装

    [root@web01 ceshi]# vim 20.sh
    #!/bin/bash
    read -p "输入要查的包 :"  name
    rpm -ql $name>/dev/null
    d=`echo $?`
    if [ $d -eq "0" ];then                                                                           
        echo "存在"
    else
        echo "不存在"
    fi
    
    

    21. 判断文件是否存在

    ```shell
    [root@web01 ceshi]# cat fun.sh 
    #!/bin/bash
    fun(){
        if [ -f $1 ];then
            echo "$1 存在"
        else
            echo "$1 不存在"
        fi
    }
    fun $1
    
    ```
    

    22.函数内如果执行的上一条是函数名,则不会返回函数本身执行的返回值

    [root@web01 ceshi]# cat fun2.sh 
    #!/bin/bash
    fun(){
        echo 50
        return 1
    }
    re=`fun`
    echo "函数的返回值是: $? "
    echo "函数执行的结果是: $re"
    
    

    [root@web01 ceshi]# cat fun3.sh 
    #!/bin/bash
    fun(){
        echo 50
        return 1
    }
    re=`fun`
    name=oldboy
    echo "函数的返回值是: $? "
    echo "函数执行的结果是: $re"
    
    

    23. 从1加到100

    [root@web01 ceshi]# cat sum.sh 
    #!/bin/bash
    i=0
    while [ $i -le 100 ]
    do
        sum=$[i+sum]
        let i++
    done
    echo $sum
    [root@web01 ceshi]# cat sum2.sh 
    #!/bin/bash
    for i in {1..100}
    do
        sum=$[i+sum]
        let i++
    done
    echo $sum
    
    

  • 相关阅读:
    win10上使用linux命令
    leetcode--js--Median of Two Sorted Arrays
    leetcode--js--Longest Substring Without Repeating Characters
    Linux常用的命令
    微信小程序
    leetcode—js—Add Two Numbers
    PHPExcel使用
    console控制台的用法
    git中常混淆的操作
    mysql解析json下的某个字段
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11836636.html
Copyright © 2020-2023  润新知