shell脚本练习案例
转至: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)提取根分区剩余空间
实现
#!/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"
结果
案例七:输入三个数并进行升序排列
分析
实现
#!/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
案例二十二:统计进程相关数量信息
分析
实现
#!/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命令获取时间
实现
#!/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脚本练习案例的更多相关文章
- 100个Linux Shell脚本经典案例(附PDF)
转载自:https://mp.weixin.qq.com/s/tCKAM67_7K7q2vJthaIsDQ 原文链接:https://wenku.baidu.com/view/4f089430a116 ...
- shell脚本小案例
1.获取远程ftp数据到本地目录 #!/bin/bash ftp -n<<! open 135.0.24.19 user exchange exchange binary cd /idep ...
- Linux 【Shell脚本经典案例】
Shell 简介 hell是linux的一外壳,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口 当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理 ...
- 30个Linux Shell脚本经典案例(上)
编写Shell过程中注意事项: 开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的 ...
- 自动化运维:(3)写一个简单的Shell脚本(案例)
一.需求 1.test.sh 脚本执行时候需要添加参数才能执行 参数和功能详情如下: 参数 执行效果 start 启动中... stop 关闭中... restart 重启中... * 脚本帮助信息. ...
- Linux Shell脚本经典案例
开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的,在函数中变量 ...
- 转 如何不耍流氓的做运维之——SHELL脚本
家都是文明人,尤其是做运维的,那叫一个斯文啊.怎么能耍流氓呢?赶紧看看,编写 SHELL 脚本如何能够不耍流氓. 下面的案例,我们以 MySQL 数据库备份 SHELL 脚本的案例来进行阐述. 不记录 ...
- 【shell】常用shell脚本
1.检查主机存活状态 #!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2" for IP in $IP_LIST; ...
- 如何不耍流氓的做运维之-SHELL脚本
前言 大家都是文明人,尤其是做运维的,那叫一个斯文啊.怎么能耍流氓呢?赶紧看看,编写SHELL脚本如何能够不耍流氓. 下面的案例,我们以MySQL数据库备份SHELL脚本的案例来进行阐述: 不记录日志 ...
随机推荐
- docker k8s安装
docker安装 删除依赖包 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...
- pycharm 安装插件
1.使用pip安装插件 pip安装指定版本的插件: pip install openpyxl==2.6.2 -i https://pypi.doubanio.com/simple/ -i后面跟的是&q ...
- python 小兵面向对象
Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...
- uni微信小程序优化,多个分包在用的公共代码该放在哪?
公共的代码包括公用的vue组件和js代码,从维护性的角度来说应该放到主包才对, 但是主包有大小限制,如果把2个分包都在用的代码放到主包里面那2M很快就满了. 所以该放在哪?我的方案是从维护的角度放在主 ...
- 如何为Windows服务增加Log4net和EventLog的日志功能。
一.简介 最近在做一个项目的时候,需要该项目自动启动.自动运行,不需要认为干预.不用说,大家都知道用什么技术,那就是 Windows服务.在以前的Net Framework 平台下,Windows 服 ...
- ABC231H(二分图最小权边覆盖)
首先将行列分别抽象成 \(h, w\) 个点,每个格子视作连接两个点的一条边,那么问题就转化为了二分图最小权边覆盖问题. 考虑最后答案形如:若干组互不相交的匹配加上其他点连接到匹配内. 于此同时,不在 ...
- css自定义属性(css变量)
感谢原文作者:Kuku殿下 原文链接:https://segmentfault.com/a/1190000015948538 前言 刚开始的"css变量",经扩展之后,称为&quo ...
- Android中四大组件
Activity BroadCast Receiver 广播接收者 Service 服务 Content Provider 内容提供者 四大组件都需要在清单文件里面配置一下
- UNIX系统上的抓包工具tcpdump常用命令说明
tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才 ...
- shell编程之免交互 (不要再让你的双手过度劳累了)
shell编程之免交互 1.Here Document免交互 2.Expect免交互 3.免交互磁盘创建 1.Here Document免交互 概述: Here Document使用I/O重定向的方式 ...