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

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 '-'"\b\c"
sleep $INTERVAL
;;
"2")
echo -e '\\'"\b\c"
sleep $INTERVAL
;;
"3")
echo -e "|\b\c"
sleep $INTERVAL
;;
"4")
echo -e "/\b\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 "\033[46m \033[0m"
else
echo -ne "\033[47m \033[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 "\033[3;${i}H*"
sleep 0.1
done
clear
for i in {20..1}
do
echo -e "\033[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 "\033[34m$msg\033[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]"

结果

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. docker k8s安装

    docker安装 删除依赖包 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...

  2. pycharm 安装插件

    1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...

  3. python 小兵面向对象

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  4. uni微信小程序优化,多个分包在用的公共代码该放在哪?

    公共的代码包括公用的vue组件和js代码,从维护性的角度来说应该放到主包才对, 但是主包有大小限制,如果把2个分包都在用的代码放到主包里面那2M很快就满了. 所以该放在哪?我的方案是从维护的角度放在主 ...

  5. 如何为Windows服务增加Log4net和EventLog的日志功能。

    一.简介 最近在做一个项目的时候,需要该项目自动启动.自动运行,不需要认为干预.不用说,大家都知道用什么技术,那就是 Windows服务.在以前的Net Framework 平台下,Windows 服 ...

  6. ABC231H(二分图最小权边覆盖)

    首先将行列分别抽象成 \(h, w\) 个点,每个格子视作连接两个点的一条边,那么问题就转化为了二分图最小权边覆盖问题. 考虑最后答案形如:若干组互不相交的匹配加上其他点连接到匹配内. 于此同时,不在 ...

  7. css自定义属性(css变量)

    感谢原文作者:Kuku殿下 原文链接:https://segmentfault.com/a/1190000015948538 前言 刚开始的"css变量",经扩展之后,称为&quo ...

  8. Android中四大组件

    Activity  BroadCast Receiver 广播接收者 Service  服务 Content Provider 内容提供者   四大组件都需要在清单文件里面配置一下

  9. UNIX系统上的抓包工具tcpdump常用命令说明

    tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才 ...

  10. shell编程之免交互 (不要再让你的双手过度劳累了)

    shell编程之免交互 1.Here Document免交互 2.Expect免交互 3.免交互磁盘创建 1.Here Document免交互 概述: Here Document使用I/O重定向的方式 ...