转至:https://www.cnblogs.com/tui463/archive/2004/01/13/12663024.html

shell脚本练习案例

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

分析

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

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

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

实现

  1. #!/bin/bash
  2. useradd "111"
  3. echo "123456" | passwd --stdin "111"

结果

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

分析

(1)安装服务

(2)启动服务

(3)查看启动状态

实现

  1. #!/bin/bash
  2. yum -y install httpd
  3. yum -y install mariadb mariadb-devel mariadb-server
  4. yum -y install php php-mysql
  5. systemctl start httpd mariadb
  6. systemctl enable httpd mariadb

结果

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

分析

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

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

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

实现

  1. #!/bin/bash
  2. disk_size=$(df / | awk '/\//{print $4}')
  3. mem_size=$(free | awk '/Mem/{print $4}')
  4. while :
  5. do
  6. if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
  7. then
  8. mail -s "Warning" root <<EOF
  9. Insufficient resources,资源不足
  10. EOF
  11. fi
  12. done

案例四:猜数字游戏

分析

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

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

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

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

实现

  1. #!/bin/bash
  2. num=$[RANDOM%100+1]
  3. echo "$num"
  4. while :
  5. do
  6. read -p "计算机生成了一个1-100的随机数,你猜:" cai
  7. if [ $cai -eq $num ]
  8. then
  9. echo "恭喜,猜对了"
  10. exit
  11. elif [ $cai -gt $num ]
  12. then
  13. echo "Oops,猜大了"
  14. else
  15. echo "Oops,猜小了"
  16. fi
  17. done

结果

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

分析

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

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

实现

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

案例六:创建用户

分析

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

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

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

实现

  1. #!/bin/bash
  2. read -p "请输入用户名:" user
  3. if [ -z $user ];then
  4. echo "您不需输入账户名"
  5. exit 2
  6. fi
  7. stty -echo
  8. read -p "请输入密码:" pass
  9. stty echo
  10. pass=${pass:-123456}
  11. useradd "$user"
  12. 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 变量中存的是小一点的值

实现

  1. #!/bin/bash
  2. read -p "请输入一个整数:" num1
  3. read -p "请输入一个整数:" num2
  4. read -p "请输入一个整数:" num3
  5. tmp=0
  6. if [ $num1 -gt $num2 ];then
  7. tmp=$num1
  8. num1=$num2
  9. num2=$tmp
  10. fi
  11. if [ $num1 -gt $num3 ];then
  12. tmp=$num1
  13. num1=$num3
  14. num3=$tmp
  15. fi
  16. if [ $num2 -gt $num3 ];then
  17. tmp=$num2
  18. num2=$num3
  19. num3=$tmp
  20. fi
  21. echo "排序后数据(从小到大)为:$num1,$num2,$num3"

结果

案例八:石头剪刀布游戏

分析

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

实现

  1. #!/bin/bash
  2. game=(石头 剪刀 布)
  3. num=$[RANDOM%3]
  4. computer=${game[$num]}
  5. echo "请根据下列提示选择您的出拳手势"
  6. echo "1.石头"
  7. echo "2.剪刀"
  8. echo "3.布"
  9. read -p "请选择 1-3:" person
  10. case $person in
  11. 1)
  12. if [ $num -eq 0 ]
  13. then
  14. echo "平局"
  15. elif [ $num -eq 1 ]
  16. then
  17. echo "你赢"
  18. else
  19. echo "计算机赢"
  20. fi;;
  21. 2)
  22. if [ $num -eq 0 ]
  23. then
  24. echo "计算机赢"
  25. elif [ $num -eq 1 ]
  26. then
  27. echo "平局"
  28. else
  29. echo "你赢"
  30. fi;;
  31. 3)
  32. if [ $num -eq 0 ]
  33. then
  34. echo "你赢"
  35. elif [ $num -eq 1 ]
  36. then
  37. echo "计算机赢"
  38. else
  39. echo "平局"
  40. fi;;
  41. *)
  42. echo "必须输入1-3的数字"
  43. esac

结果

案例九:进度条

分析

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

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

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

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

实现

  1. #!/bin/bash
  2. rotate_line(){
  3. INTERVAL=0.5
  4. COUNT="0"
  5. while :
  6. do
  7. COUNT=`expr $COUNT + 1`
  8. case $COUNT in
  9. "1")
  10. echo -e '-'"\b\c"
  11. sleep $INTERVAL
  12. ;;
  13. "2")
  14. echo -e '\\'"\b\c"
  15. sleep $INTERVAL
  16. ;;
  17. "3")
  18. echo -e "|\b\c"
  19. sleep $INTERVAL
  20. ;;
  21. "4")
  22. echo -e "/\b\c"
  23. sleep $INTERVAL
  24. ;;
  25. *)
  26. COUNT="0";;
  27. esac
  28. done
  29. }
  30. rotate_line

结果

动态显示时针

案例十:乘法表

实现

  1. #!/bin/bash
  2. for i in `seq 9`
  3. do
  4. for j in `seq $i`
  5. do
  6. echo -n "$j*$i=$[i*j] "
  7. done
  8. echo
  9. done

结果

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

分析

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

实现

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

结果

案例十二: 点名器脚本

分析

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

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

实现

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

结果

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

分析

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

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

实现

  1. #! /bin/bash
  2. sum=0
  3. for i in `seq 100`
  4. do
  5. sum=$[sum+i]
  6. done
  7. echo "总和是:$sum"

结果

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

分析

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

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

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

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

实现

  1. #!/bin/bash
  2. for i in {1..8}
  3. do
  4. for j in {1..8}
  5. do
  6. sum=$[i+j]
  7. if [ $[sum%2] -eq 0 ];then
  8. echo -ne "\033[46m \033[0m"
  9. else
  10. echo -ne "\033[47m \033[0m"
  11. fi
  12. done
  13. echo
  14. done

结果

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

分析

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

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

实现

  1. #!/bin/bash
  2. cd /var/log
  3. sum=0
  4. for i in `ls -r *`
  5. do
  6. if [ -f $i ];then
  7. let sum++
  8. echo "文件名:$i"
  9. fi
  10. done
  11. echo "总文件数量为:$sum"

结果

案例十六: 查找僵尸进程

分析

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

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

实现

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

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

分析

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

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

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

实现

  1. #!/bin/bash
  2. read -p "请输入一个年份:" year
  3. if [ "$year" = "" ];then
  4. echo "没有输入年份"
  5. exit
  6. fi
  7. if [[ "$year" =~ [a-Z] ]];then
  8. echo "你输入的不是数字"
  9. exit
  10. fi
  11. if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ];then
  12. echo "$year年是闰年"
  13. elif [ $[year % 400] -eq 0 ];then
  14. echo "$year年是闰年"
  15. else
  16. echo "$year年不是闰年"
  17. fi

结果

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

分析

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

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

实现

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

结果

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

分析

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

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

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

实现

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

结果

案例二十:显示用户名称

分析

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

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

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

实现

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

结果

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

分析

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

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

(3)时间间隔为0.1秒

实现

  1. #!/bin/bash
  2. while :
  3. do
  4. clear
  5. for i in {1..20}
  6. do
  7. echo -e "\033[3;${i}H*"
  8. sleep 0.1
  9. done
  10. clear
  11. for i in {20..1}
  12. do
  13. echo -e "\033[3;${i}H*"
  14. sleep 0.1
  15. done
  16. clear
  17. done
 

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

分析

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

实现

  1. #!/bin/bash
  2. running=0
  3. sleeping=0
  4. stoped=0
  5. zombie=0
  6. for pid in /proc/[1-9]*
  7. do
  8. procs=$[procs +1]
  9. stat=$(awk '{print $3}' $pid/stat)
  10. case $stat in
  11. R)
  12. running=$[running+1]
  13. ;;
  14. T)
  15. stoped=$[stoped+1]
  16. ;;
  17. S)
  18. sleeping=$[sleeping+1]
  19. ;;
  20. Z)
  21. zombie=$[zombie+1]
  22. ;;
  23. esac
  24. done
  25. echo "进程统计信息如下"
  26. echo "总进程数量为:$procs"
  27. echo "Running进程数为:$running"
  28. echo "Stoped进程数为:$stoped"
  29. echo "Sleeping进程数为:$sleeping"
  30. echo "Zombie进程数为:$zombie"

结果

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

分析

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

(2)根据等级分类

实现

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

结果

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

分析

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

实现

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

结果

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

分析

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

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

实现

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

结果

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

分析

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

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

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

实现

  1. #!/bin/bash
  2. read -p "Are you sure?[y/n]:" sure
  3. case $sure in
  4. y|Y|Yes|YES)
  5. echo "you enter girl"
  6. ;;
  7. n|N|NO|no)
  8. echo "you enter boy"
  9. ;;
  10. *)
  11. echo "error";;
  12. esac

结果

案例二十七:打印图形

分析

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

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

实现

  1. #!/bin/bash
  2. clear
  3. for ((i=1;i<=9;i++))
  4. do
  5. for ((j=1;j<=i;j++))
  6. do
  7. echo -n "$i"
  8. done
  9. echo ""
  10. done
  11. read -n1 "按任意键继续" key
  12. clear
  13. for ((i=1;i<=5;i++))
  14. do
  15. for ((j=1;j<=i;j++))
  16. do
  17. echo -n " |"
  18. done
  19. echo "_ "
  20. done
  21. read -n1 "按任意键继续" key
  22. clear
  23. for ((i=1;i<=5;i++))
  24. do
  25. for ((j=1;j<=i;j++))
  26. do
  27. echo -n " *"
  28. done
  29. echo ""
  30. done
  31. for ((i=5;i>=1;i--))
  32. do
  33. for ((j=1;j<=i;j++))
  34. do
  35. echo -n " *"
  36. done
  37. echo ""
  38. done

结果

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

分析

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

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

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

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

实现

  1. #!/bin/bash
  2. tm=$(date +%H)
  3. if [ $tm -le 12 ];then
  4. msg="上午好美女"
  5. elif [ $tm -gt 12 -a $tm -le 18 ];then
  6. msg="下午好美女"
  7. else
  8. msg="晚上好美女"
  9. fi
  10. echo "当前时间是:$(date +"%Y-%m-%d %H:%M:%S")"
  11. echo -e "\033[34m$msg\033[0m"

结果

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

分析

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

(2)定义数组名称为name

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

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

实现

  1. #!/bin/bash
  2. i=0
  3. while :
  4. do
  5. read -p "请输入账户名,输入over结束:" key
  6. if [ $key == "over" ];then
  7. break
  8. else
  9. name[$i]=$key
  10. let i++
  11. fi
  12. done
  13. echo "总帐户名数量:${#name[*]}"
  14. echo "${name[@]}"

结果

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

分析

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

实现

  1. #!/bin/bash
  2. echo "first number $1"
  3. echo "second number $2"
  4. echo "$(($1+$2))"
  5. echo "$[$1-$2]"
  6. echo "$[$1*$2]"
  7. echo "$[$1/$2]"

结果

shell脚本练习案例的更多相关文章

  1. 100个Linux Shell脚本经典案例(附PDF)

    转载自:https://mp.weixin.qq.com/s/tCKAM67_7K7q2vJthaIsDQ 原文链接:https://wenku.baidu.com/view/4f089430a116 ...

  2. shell脚本小案例

    1.获取远程ftp数据到本地目录 #!/bin/bash ftp -n<<! open 135.0.24.19 user exchange exchange binary cd /idep ...

  3. Linux 【Shell脚本经典案例】

    Shell 简介 hell是linux的一外壳,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口 当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理 ...

  4. 30个Linux Shell脚本经典案例(上)

    编写Shell过程中注意事项: 开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的 ...

  5. 自动化运维:(3)写一个简单的Shell脚本(案例)

    一.需求 1.test.sh 脚本执行时候需要添加参数才能执行 参数和功能详情如下: 参数 执行效果 start 启动中... stop 关闭中... restart 重启中... * 脚本帮助信息. ...

  6. Linux Shell脚本经典案例

    开头加解释器:#!/bin/bash    语法缩进,使用四个空格:多加注释说明.    命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用.    默认变量是全局的,在函数中变量 ...

  7. 转 如何不耍流氓的做运维之——SHELL脚本

    家都是文明人,尤其是做运维的,那叫一个斯文啊.怎么能耍流氓呢?赶紧看看,编写 SHELL 脚本如何能够不耍流氓. 下面的案例,我们以 MySQL 数据库备份 SHELL 脚本的案例来进行阐述. 不记录 ...

  8. 【shell】常用shell脚本

    1.检查主机存活状态 #!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2" for IP in $IP_LIST; ...

  9. 如何不耍流氓的做运维之-SHELL脚本

    前言 大家都是文明人,尤其是做运维的,那叫一个斯文啊.怎么能耍流氓呢?赶紧看看,编写SHELL脚本如何能够不耍流氓. 下面的案例,我们以MySQL数据库备份SHELL脚本的案例来进行阐述: 不记录日志 ...

随机推荐

  1. K8S SVC 转发原理

    在前面的文章中,我们已经多次使用到了 Service 这个 Kubernetes 里重要的服务对象.而 Kubernetes 之所以需要 Service,一方面是因为 Pod 的 IP 不是固定的,另 ...

  2. PythonGuru 中文系列教程·翻译完成

    原文:PythonGuru 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 学习资源 目录 初级 Python ...

  3. 关于mysql,需要掌握的基础(一):CRUD、存储引擎、单表查询相关、多表查询join、事务并发、权限管理等等

    目录 关于mysql,需要掌握的基础(一): 1.了解数据库sql.数据库系统.数据库管理系统的概念. 2.了解DDL.DML.DQL语句是什么? 3.了解存储引擎.存储引擎[InnoDB 和 MyI ...

  4. js-小知识点

    强类型定义语言和弱类型定义语言1)强类型定义语言: 强制数据类型定义的语言.也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了.举个例子:如果你定义了一个整型 ...

  5. bom案例6-轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Java线程--CompletionService使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871911.html Java线程--CompletionService使用 public ...

  7. js获取 url?后面的参数取值

    function GetRequest() {     var url = location.search; //获取url中"?"符后的字串     var theRequest ...

  8. Linux Shell中的数组及遍历 转

    转自:http://www.linuxidc.com/Linux/2011-09/42929.htm 在Linux下使用shell的时候,为方便起见,偶尔会用到一下数组.数组的申明方式是: array ...

  9. Docker私有仓库与Harbor部署使用

    Docker私有仓库与Harbor部署使用 目录 Docker私有仓库与Harbor部署使用 一.本地私有仓库 1. 下载registry镜像 2. 在daemon.json文件中添加私有镜像仓库地址 ...

  10. 直接引入vue.js和使用vue脚手架的区别?

    脚手架工具搭建的项目是把Vue作为一个模块(如CommonJS规范的模块)对待,在源码中引入vue模块,最终需要用构建工具(如webpack)载入模块,编写代码需要require('vue'). 而直 ...