zoukankan      html  css  js  c++  java
  • shell脚本练习案例

    shell脚本练习案例

    案例一:通过位置变量创建系统账户及密码

    分析

    (1)通过位置变量创建 Linux 系统账户及密码

    (2)创建用户,111为第一个变量

    (3)为用户设置密码,123456为第二个变量

    实现

    #!/bin/bash
    useradd "111"
    echo "123456" | passwd --stdin "111"

    结果

    案例二:一键部署 LNMP(RPM 包版本)

    分析

    (1)安装服务

    (2)启动服务

    (3)查看启动状态

    实现

    #!/bin/bash
    yum -y install httpd
    yum -y install mariadb mariadb-devel mariadb-server
    yum -y install php php-mysql
    systemctl start httpd mariadb
    systemctl enable httpd mariadb

    结果

    案例三:监控内存和磁盘容量

    分析

    (1)实时监控本机内存和硬盘剩余空间

    (2)提取根分区剩余空间

    (3)提取内存剩余空间
    (4)剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员

    实现

    #!/bin/bash
    disk_size=$(df / | awk '///{print $4}')
    mem_size=$(free | awk '/Mem/{print $4}')
    while :
    do
    if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
    then
            mail -s "Warning" root <<EOF
            Insufficient resources,资源不足
    EOF
    fi
    done

     

    案例四:猜数字游戏

    分析

    (1)脚本生成一个100以内的随机数

    (2)根据用户的输入,提示猜大了或者猜小了,直到用户猜对

    (3)使用read提示用户猜数字

    (4)使用if判断用户猜的数字

    实现

    #!/bin/bash
    num=$[RANDOM%100+1]
    echo "$num"
    while :
    do
            read -p "计算机生成了一个1-100的随机数,你猜:" cai
         if [ $cai -eq $num ]
         then
            echo "恭喜,猜对了"
            exit
            elif [ $cai -gt $num ]
            then
                    echo "Oops,猜大了"
            else
                    echo "Oops,猜小了"
            fi
    done

    结果

    案例五:检测本机当前用户是否为超级管理员

    分析

    (1)如果是管理员,则使用 yum 安装 vsftpd

    (2)如果不是,则提示您非管理员

    实现

    #!/bin/bash
    if [ $USER == "root" ]
    then
            yum -y install vsftpd
    else
            echo "您不是管理员,没有权限安装软件"
    fi

     

    案例六:创建用户

    分析

    (1)提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码

    (2)如果用户不输入账户名,则提示必须输入账户名并退出脚本

    (3)如果用户不输入密码,则统一使用默认的 123456 作为默认密码

    实现

    #!/bin/bash
    read -p "请输入用户名:" user
    if [ -z $user ];then
            echo "您不需输入账户名"
            exit 2
    fi
    stty -echo
    read -p "请输入密码:" pass
    stty echo
    pass=${pass:-123456}
    useradd "$user"
    echo "$pass" | passwd --stdin "$user"

    结果

     

    案例七:输入三个数并进行升序排列 

    分析

    (1)依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
    (2)不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
    (3)num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
    (4)如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
    (5)如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
    (6)如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值

    实现

    #!/bin/bash
    read -p "请输入一个整数:" num1
    read -p "请输入一个整数:" num2
    read -p "请输入一个整数:" num3
    tmp=0
    if [ $num1 -gt $num2 ];then
            tmp=$num1
            num1=$num2
            num2=$tmp
    fi
    if [ $num1 -gt $num3 ];then
            tmp=$num1
            num1=$num3
            num3=$tmp
    fi
    if [ $num2 -gt $num3 ];then
            tmp=$num2
            num2=$num3
            num3=$tmp
    fi
    echo "排序后数据(从小到大)为:$num1,$num2,$num3"

    结果

    案例八:石头剪刀布游戏 

    分析

    通过随机数获取计算机的出拳

    实现

    #!/bin/bash
    game=(石头 剪刀 布)
    num=$[RANDOM%3]
    computer=${game[$num]}
    echo "请根据下列提示选择您的出拳手势"
    echo "1.石头"
    echo "2.剪刀"
    echo "3.布"
    read -p "请选择 1-3:" person
    case $person in
    1)
    if [ $num -eq 0 ]
    then
            echo "平局"
    elif [ $num -eq 1 ]
    then
            echo "你赢"
    else
            echo "计算机赢"
    fi;;
    2)
    if [ $num -eq 0 ]
    then
            echo "计算机赢"
    elif [ $num -eq 1 ]
    then   
            echo "平局"
    else
            echo "你赢"
    fi;;
    3)
    if [ $num -eq 0 ]
    then
            echo "你赢"
    elif [ $num -eq 1 ]
    then   
            echo "计算机赢"
    else
            echo "平局"
    fi;;
    *)
            echo "必须输入1-3的数字"
    esac

    结果

     

    案例九:进度条

    分析

    (1)定义一个显示进度的函数,屏幕快速显示 | / -

    (2)设置4个形状的编号,默认编号为0

    (3)执行循环,COUNT每次循环加1

    (4)判断COUNT的值,值不一样显示的形状就不一样

    实现

    #!/bin/bash
    rotate_line(){
    INTERVAL=0.5
    COUNT="0"
    while :
    do
    COUNT=`expr $COUNT + 1`
    case $COUNT in
    "1")
            echo -e '-'"c"
            sleep $INTERVAL
            ;;
    "2")
            echo -e '\'"c"
            sleep $INTERVAL
            ;;
    "3")
            echo -e "|c"
            sleep $INTERVAL
            ;;
    "4")
            echo -e "/c"
            sleep $INTERVAL
            ;;
    *)
            COUNT="0";;
    esac
    done
    }
    rotate_line

    结果

    动态显示时针

     

    案例十:乘法表

    实现

    #!/bin/bash
    for i in `seq 9`
    do
      for j in `seq $i`
      do
      echo -n "$j*$i=$[i*j] "
      done
      echo
    done

    结果

    案例十一: 实时显示数据包流量

    分析

    使用死循环实时显示 eth0 网卡发送的数据包流量

    实现

    #!/bin/bash
    while :
    do
            echo '本地网卡eth0流量信息如下:'
            ifconfig eth0 | grep "RX pack" | awk '{print $5}'
            ifconfig eth0 | grep "TX pack" | awk '{print $5}'
            sleep 1
    done

    结果

    案例十二: 点名器脚本

    分析

    (1)提前准备一个user.txt文件

    (2)文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名

    实现

    #!/bin/bash
    while :
    do
    line=`cat user.txt | wc -l`
    num=$[RANDOM%line+1]
    sed -n "${num}p" user.txt
    sleep 0.2
    clear
    done

    结果

    案例十三:100以内的所有正整数相加求和 

    分析

    (1)对 100 以内的所有正整数相加求和(1+2+3+4...+100)

    (2)seq 100 可以快速自动生成100个整数

    实现

    #! /bin/bash
    sum=0
    for i in `seq 100`
    do
            sum=$[sum+i]
    done
    echo "总和是:$sum"

    结果

    案例十四: 打印国际象棋棋盘

    分析

    (1)设置两个变量,i和j,一个代表行,一个代表列

    (2)i=1 代表准备第一行棋盘,第一行棋盘有灰色和蓝色间隔输出

    (3)棋盘的规律是i+j,如果是偶数,就打印蓝色色块,是基数就打印灰色色块

    (4)打印完成色块后不自动换行,在同一行继续输出其他色块

    实现

    #!/bin/bash
    for i in {1..8}
    do
      for j in {1..8}
      do
            sum=$[i+j]
            if [ $[sum%2] -eq 0 ];then
                    echo -ne "33[46m 33[0m"
            else
                    echo -ne "33[47m 33[0m"
            fi
      done
      echo
    done

    结果

    案例十五: 统计文件个数并显示文件名

    分析

    (1)统计/var/log 有多少个文件,并显示这些文件名

    (2)使用ls递归显示所有,再判断是否为文件

    实现

    #!/bin/bash
    cd /var/log
    sum=0
    for i in `ls -r *`
    do
            if [ -f $i ];then
            let sum++
            echo "文件名:$i"
            fi
    done
    echo "总文件数量为:$sum"

    结果

    案例十六: 查找僵尸进程

    分析

    (1)查找 Linux 系统中的僵尸进程

    (2)awk判断ps命令输出的第八列为Z,显示该进程的PID和进程命令

    实现

    #!/bin/bash
    ps aux | awk '{if($8 == "Z"){print $2,$11}}'

     

    案例十七:判断年份是否为闰年

    分析

    (1)提示用户输入年份后判断该年是否为闰年

    (2)能被4整除并且不能被100整除的年份是闰年

    (3)能被400整除的年份也是闰年

    实现

    #!/bin/bash
    read -p "请输入一个年份:" year
    if [ "$year" = "" ];then
            echo "没有输入年份"
            exit
    fi
    if [[ "$year" =~ [a-Z] ]];then
            echo "你输入的不是数字"
            exit
    fi
    if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ];then
            echo "$year年是闰年"
    elif [ $[year % 400] -eq 0 ];then
            echo "$year年是闰年"
    else
            echo "$year年不是闰年"
    fi

    结果

    案例十八: 测试用户名和密码是否正确

    分析

    (1)测试用户名与密码是否正确

    (2)用户名为tom并且密码为123456,提示登录成功,否则提示登录失败

    实现

    #!/bin/bash
    read -p "请输入用户名:" user
    read -p "请输入密码:" pass
    if [ "$user" == 'tom' -a "$pass" == '123456' ];then
            echo "Login successful"
    else
            echo "Login Failed"
    fi

    结果

    案例十九:循环测试用户名和密码是否正确

    分析

    (1)循环测试用户名与密码是否正确

    (2)最多测试三次,输入正确提示登陆成功,否则提示登陆失败

    (3)用户名为tom,密码为123456

    实现

    #!/bin/bash
    for i in {1..3}
    do
            read -p "请输入用户名:" user
            read -p "请输入密码:" pass
    if [ "$user" == 'tom' -a "$pass" == '123456' ];then
            echo "Login successful"
            exit
    fi
    done
    echo "Login Failed"

    结果

    案例二十:显示用户名称

    分析

    (1)显示当前计算机中所有账户的用户名称

    (2)指定以:为分隔符,打印文件的第一列

    (3)使用sed的替换功能,将文件中:后面的所有内容替换为空

    实现

    #!/bin/bash
    awk -F: '{print $1}' /etc/passwd
    cut -d: -f1 /etc/passwd
    sed 's/:.*//' /etc/passwd

    结果

    案例二十一:显示回旋镖进度

    分析

    (1)先从第一个到第二十个符号

    (2)再从第二十个回到第一个符号

    (3)时间间隔为0.1秒

    实现

    #!/bin/bash
    while :
    do
       clear
       for i in {1..20}
       do
            echo -e "33[3;${i}H*"
            sleep 0.1
       done
       clear
       for i in {20..1}
       do
            echo -e "33[3;${i}H*"
            sleep 0.1
       done
       clear
    done
     

    案例二十二:统计进程相关数量信息

    分析

    (1)统计Linux进程相关数量信息
    (2)在proc目录下所有以数字开始的都是当前计算机正在运行的进程的PID
    (3)每个PID编号的目录下记录有该进程相关的信息
    (4)每个PID目录下都有一个stat文件,该文件的第三列是该进程的状态信息
     

    实现

    #!/bin/bash
    running=0
    sleeping=0
    stoped=0
    zombie=0
    for pid in /proc/[1-9]*
    do
            procs=$[procs +1]
            stat=$(awk '{print $3}' $pid/stat)
            case $stat in
    R)
            running=$[running+1]
            ;;
    T)
            stoped=$[stoped+1]
            ;;
    S)
            sleeping=$[sleeping+1]
            ;;
    Z)
            zombie=$[zombie+1]
            ;;
            esac
    done
    echo "进程统计信息如下"
    echo "总进程数量为:$procs"
    echo "Running进程数为:$running"
    echo "Stoped进程数为:$stoped"
    echo "Sleeping进程数为:$sleeping"
    echo "Zombie进程数为:$zombie"

    结果

    案例二十三:判断用户等级

    分析

    (1)从键盘读取一个论坛积分,判断论坛用户等级

    (2)根据等级分类

    实现

    #!/bin/bash
    read -p "请输入积分(0-100):" JF
    if [ $JF -ge 90 ];then
            echo "$JF分,神功绝世"
    elif [ $JF -ge 80 ];then
            echo "$JF分,登峰造极"
    elif [ $JF -ge 70 ];then
            echo "$JF分,炉火纯青"
    elif [ $JF -ge 60 ];then
            echo "$JF分,略有小成"
    else
            echo "$JF分,初学乍练"
    fi

    结果

    案例二十四:判读输入的数据类型

    分析

    判断用户输入的数据类型,字母数字或其他

    实现

    #!/bin/bash
    read -p "请输入一个字符:" KEY
    case "$KEY" in
    [a-z]|[A-Z])
            echo "字母"
            ;;
    [0-9])
            echo "数字"
            ;;
    *)
            echo "空格、功能键或其他控制字符"
    esac

    结果

    案例二十五:打印斐波那契数列

    分析

    (1)该数列的特点是后一个数字永远是前2个数字之和

    (2)如:0  1  1  2  3  5  8  13 ........

    实现

    #!/bin/bash
    list=(0 1)
    for i in `seq 2 11`
    do
            list[$i]=`expr ${list[-1]} + ${list[-2]}`
    done
    echo ${list[@]}

    结果 

    案例二十六: 判断输入的是否

    分析

    (1)当输入y、Y、Yes、YES时显示你选择女孩

    (2)当输入n、N、NO、no时显示你选择男孩

    (3)当输入其他时候显示失败

    实现

    #!/bin/bash
    read -p "Are you sure?[y/n]:" sure
    case $sure in
    y|Y|Yes|YES)
            echo "you enter girl"
            ;;
    n|N|NO|no)
            echo "you enter boy"
            ;;
    *)
            echo "error";;
    esac

    结果

     

    案例二十七:打印图形 

    分析

    (1)使用shell脚本打印图形

    (2)for (()) 为类C语言的语法格式 

    实现

    #!/bin/bash
    clear
    for ((i=1;i<=9;i++))
    do
    for ((j=1;j<=i;j++))
    do
    echo -n "$i"
    done
    echo ""
    done
    read -n1 "按任意键继续" key
    clear
    for ((i=1;i<=5;i++))
    do
    for ((j=1;j<=i;j++))
    do
    echo -n " |"
    done
    echo "_ "
    done
    read -n1 "按任意键继续" key
    clear
    for ((i=1;i<=5;i++))
    do
    for ((j=1;j<=i;j++))
    do
    echo -n " *"
    done
    echo ""
    done
    for ((i=5;i>=1;i--))
    do
    for ((j=1;j<=i;j++))
    do
    echo -n " *"
    done
    echo ""
    done

    结果

     

     

     

    案例二十八:根据时间返回问候语

    分析 

    (1)根据计算机当前时间,返回问候语 

    (2)00-12点为早晨,12-18点为下午,18-24为晚上

    (3)使用date命令获取时间

    (4)if判断时间的区间,确定问候语内容

     实现

    #!/bin/bash
    tm=$(date +%H)
    if [ $tm -le 12 ];then
            msg="上午好美女"
    elif [ $tm -gt 12 -a $tm -le 18 ];then
            msg="下午好美女"
    else
            msg="晚上好美女"
    fi
    echo "当前时间是:$(date +"%Y-%m-%d %H:%M:%S")"
    echo -e "33[34m$msg33[0m"

    结果

    案例二十九:将账户写入数组保存

    分析

    (1)读取用户输入的账户名称,将账户名写入到数组保存

    (2)定义数组名称为name

    (3)数组的下标为i,小标从0开始,每输入一个账户名,下标加1,继续存下一个

    (4)最后输入over,脚本输出总结性信息后脚本退出

    实现

    #!/bin/bash
    i=0
    while :
    do
    read -p "请输入账户名,输入over结束:" key
    if [ $key == "over" ];then
    break
    else
    name[$i]=$key
    let i++
    fi
    done
    echo "总帐户名数量:${#name[*]}"
    echo "${name[@]}"

    结果

    案例三十: 计算两个整数的和差积商

    分析

    传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,商

    实现

    #!/bin/bash
    echo "first number $1"
    echo "second number $2"
    echo "$(($1+$2))"
    echo "$[$1-$2]"
    echo "$[$1*$2]"
    echo "$[$1/$2]"

    结果

  • 相关阅读:
    HDU1325 Is It A Tree? (并查集判断有向图是否是树)
    DRF 视图家族及路由层补充
    DRF 外键字段深度查询优化、ListSerializer辅助完成群改
    DRF的orm多表关系补充及serializer子序列化
    DRF序列化
    DRF的封装:APIView类及五大模块
    DRF简介/接口概念
    vue-axios插件、django-cors插件、及vue如何使用第三方前端样式库:element/jQuery/bootstrap
    Vue项目的创建、路由、及生命周期钩子
    Vue框架-组件的概念及使用
  • 原文地址:https://www.cnblogs.com/tui463/p/12663024.html
Copyright © 2011-2022 走看看