Shell语法—— while 条件语句

while 循环语句

while 循环语句语法格式为:

while < 条件表达式 >
do指令
done

有关脚本运行的相关用法

命令说明
sh file.sh &把 file.sh 脚本放到后台运行(后台运行脚本的常用方法)
ctl+c停止执行当前脚本或任务
ctl+z暂停执行当前脚本或任务
bg把当前脚本或任务放到后台执行
fg把当前脚本或任务放到前台执行。如果是多个脚本,需加编号,如: fg 2
jobs查看当前执行的脚本或任务
kill关闭执行的脚本任务

有关进程管理的 Linux 相关命令

命令说明
kill、killall、pkill杀掉进程
ps查看进程
pstree显示进程状态树
top显示进程
renice改变优先权
nohup用户退出系统之后继续工作
pgrep查找匹配条件的进程
strace跟踪一个进程的系统调用情况
ltrace跟踪进程调用库函数的情况
小结

一. while 循环结构及相关语句综合实践

  1. while 循环的特长是执行守护进程,以及实现我们希望循环持续执行不退出的应用,适合用于频率小于 1min 的循环处理其他的 while 循环几乎都可以被 for 循环及定时任务 crontab 功能代替
  2. case 语句可以用 if 语句来替代,而在系统启动脚本时传入少量固定规则字符串的情况下,多用 case 语句,其他普通判断多用 if 语句
  3. 一句换场景,if 语句、for 语句最常用,其次是 while(守护进程)、case(服务启动脚本)

二. shell 脚本中各个语句的使用场景

  1. 条件表达式,用于简短的条件判断及输出(文件是否存在,字符串是否为空等)
  2. if 取值判断,多用于不同值数量较少的情况
  3. for 最常用于正常的循环处理中

案例一:
猜数字
随机生成一个 100 以内的数字,让用户输入数字来猜。游戏规则:输入的必须是数字,猜错时出现大小提示,才对时给出所用次数

#!/bin/bash
total=0
RETVAL=0
key=$((RANDOM%100))
echo "Let's play the guessing game!"
echo "key:$key"
panduan(){read -p "input num: " numexpr $num + 1 &>/dev/nullRETVAL=$?if [ $RETVAL -ne 0 ];thenecho "number number !!!"panduanfi
}guess(){((total++))if [ $num -lt $key ];thenecho "It is too small"panduanelif [ $num -gt $key ];thenecho "It is too big"panduanelseecho "Guess right"echo "yi gong cai le $total ci"exit 0fi
}
main(){panduanwhile truedoguessdone
}
main $*

案例二:
手机充值并发送短信。这个案例并没有实际用途,可以当做一个综合练习玩玩的
以下功能:

  1. 充值,但重复充值金额不累计,充值后立即查询余额无法正常使用
  2. 发送短信,输入发送的条数和短信内容,当金额不足时,可以选择(y:充值,n:修改发送条数,o:返回菜单)
  3. 查询余额,只有当使用发送功能选择(o:返回菜单)时,查询才可以生常使用
  4. 退出,结束当前脚本
#!/bin/bash
RETVAL=0
balance=0
menu(){
cat << EOF1) Recharge2) Send information3) Query4) exit
EOF
read -p " please enter a number: " num
case $num in1)echo "Welcome to chongzhi !"recharge;;2)echo "Welcome Check the balance !"send;;3)echo "Welcome to the query interface !"selects;;4)echo "Looking forward to your next arrival !"exit;;*)echo "Tips:{1|2|3|4}"menu
esac
}recharge(){read -p "please enter to RMB: " rmbexpr $rmb + 1 &>/dev/nullRETVAL=$?if [ $RETVAL -ne 0 ];thenecho "please input num"rechargefiecho "$rmbs  Rechargs success"((rmbs=$rmb + $balance))menu
}send(){while trueread -p "send several messages: " stripsexpr $strips + 1 &>/dev/nullRETVAL=$?if [ $RETVAL -ne 0 ];thenecho "please input num"sendfi((count=$strips * 15))doif [ $count -gt $rmbs ];thenecho "Insufficient amount !!!"read -p "Recharge(y|n|o) ?" orif [ $or = y -o $or = Y ];thenrechargeelif [ $or = n -o $or = N ];thensendelse menufielse read -p "Please input information content: " inputecho "sending:$input  send success"((balance=$rmbs - $count))echo "Balance: $balance"fi((rmbs=$rmbs - $count))done
}selects(){echo "Query:$balance"menu
}menu $*

案例三:
使用 while 守护进程的方式监控网站,每隔 10s 检测一次网站是否正常

#!/bin/bash
. /etc/init.d/functions
count=0
url_list=(
www.baidu.com
blog.51cto.com
www.taobao.com
www.192.168.80.123.com
)waits(){echo -n "3s run after"for((i=0;i<3;i++))doecho -n .sleep 1doneecho 
}url(){waitsfor((i=0; i<`echo ${#url_list[*]}`; i++))dowget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]}>/dev/null 2>&1if [ $? -eq 0 ];thenaction "${url_list[$i]}" /bin/trueelseaction "${url_list[$i]}" /bin/falsefidone((count++))
}main(){while truedourlecho "------count:$count------"sleep 10done
}
main
while 循环按行读文件

方法一:

cat 文件|while read line
do命令
done

方法二:

while read line
do命令
done<文件

案例一:
编写一个 shell 脚本,实现 cat 命令的基本功能

#!/bin/bath
while read line
doecho $line
done</home/shell/fun.sh

案例二:
编写 shell 脚本,根据短时间内的 PV 量封掉对应 ip,解决类 DoS 的功能

#!/bin/bash
count=0
while true
do
netstat -an|grep EST|awk -F '[ :]+' '{print $6}'|sort|uniq -c>ip.log
exec<ip.log
while read line
dopv=`echo $line|awk '{print $1}'`ip=`echo $line|awk '{print $2}'`if [ $pv -gt 10 ]&&[ `iptables -nL|grep $ip|wc -l` -eq 0 ];theniptables -t filter -I INPUT -s $ip -j DROPecho "sun success"fi
done((count++))
sleep 10
echo "---$count---"
done

转载于:https://blog.51cto.com/12384628/2297292

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C变量常量

变量是指其值可以变化的量。计算机中&#xff0c;指令代码、数据都存储于内存中。变量也需要存储在内存中。在计算机中&#xff0c;每个变量都被分配了一块内存空间&#xff0c;在这些空间里存储的就是变量的值。变量之所以可以变化&#xff0c;就是这个存储空间可以存储不同的…

slot

slot就是父组件把内容分发给子组件,插槽模板是slot&#xff0c;它是一个空壳子&#xff0c;因为它的显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定&#xff0c;slot写在组件template的什么位置&#xff0c;父组件传过来的模板将…

手把手教你可复用的SSO组件设计(设计篇)

周末陪女朋友去了&#xff0c;没写&#xff0c;告罪&#xff0c;上班后急忙补上。 这里说到了可复用得设计&#xff0c;所谓可复用就是指的&#xff0c;引入Dll&#xff0c;改改配置就能使用&#xff0c;而不是打开源代码东改改西改改再来调试调试最后OK。我们这里尽量提高抽象…

Object类和常用的API

第一章Object类 1.1 概述 1),Object 类是Java语言所有“引用类型”的父类&#xff0c;括我们自定义的类、类库中的类&#xff0c;数组&#xff0c;集合&#xff0c;字符串。 2),所有的的引用类型都从Object类继承了一些方法&#xff1a; 如&#xff0c;1).toString() 2).equal…

前端能力划分

前端学习学的是什么&#xff0c;在不同的阶段我思考这个问题。 最近的结论是&#xff1a;前端学习要学的是前端的三大能力。工程能力&#xff0c;架构能力&#xff0c;开发能力。 工程能力 工程能力的范畴我认为涵盖了项目模板的自动化生成、项目的自动化编译和构建。 当然传统…

英语学习网址

英文写作网 &#xff08; www.4ewriting.com &#xff09;提供英文写作的各种相关技巧&#xff0c;主要内容包括写作语法文法、应用写作、考试作文、写作范文、背景文化 佳作欣赏、原创发表、英文blog、英语笔友、名师指导、写作论坛等。 1. 英语学习&#xff1a;英语学习频道(…

Anaconda+vscode+pytorch环境搭建

1、安装Anaconda Anaconda指的是一个开源的Python发行版本&#xff0c;其包含了conda、Python等180多个科学包及其依赖项。在官网上下载https://www.anaconda.com/distribution/&#xff0c;因为服务器在国外会很慢&#xff0c;建议从清华镜像https://mirrors.tuna.tsinghua.ed…

git learn

$ git config --global user.name "Your Name" $ git config --global user.email "emailexample.com"因为Git是分布式版本控制系统&#xff0c;所以&#xff0c;每个机器都必须自报家门&#xff1a;你的名字和Email地址。你也许会担心&#xff0c;如果有人…

C#.NET 中的类型转换

C# 出来也有些日子了&#xff0c;最近由于编程的需要&#xff0c;对 C# 的类型转换做了一些研究&#xff0c;其内容涉及 C# 的装箱/拆箱/别名、数值类型间相互转换、字符的 ASCII 码和 Unicode 码、数值字符串和数值之间的转换、字符串和字符数组/字节数组之间的转换、各种数值…

AngularJS的学习--$on、$emit和$broadcast的使用

来源&#xff1a;http://www.cnblogs.com/CraryPrimitiveMan/p/3679552.html AngularJS中的作用域有一个非常有层次和嵌套分明的结构。其中它们都有一个主要的$rootScope(也就说对应的Angular应用或者ng-app)&#xff0c;然后其他所有的作用域部分都是继承自这个$rootScope的&a…

17、【 商品管理模块开发】——后台商品图片的springmvc和富文本上传以及ftp文件服务器的开发...

1、FTP文件服务器的搭建&#xff1a; 软件下载&#xff1a;ftpserver&#xff1b; image.png浏览器访问&#xff1a;ftp://127.0.0.1/image.png点击任意一个文件&#xff0c;就可以看到我们图片啦&#xff0c;前提是前面指定的目录里面有图片文件~ image.png2、接口编写&#x…

我们常说……

从过完元旦到现在&#xff0c;乖乖在公司办公的时间很少&#xff0c;好多时候都是在外地&#xff0c;或者是在路上、车上。有n多次&#xff0c;乖乖一天至少坐6个小时的车&#xff0c;回到家里都是带着一身的疲惫&#xff0c;虽然他并不表现出来&#xff0c;但是因为长时间坐车…

那些油管上高质量的学习编程的频道 之一

国内确实有很多不错的学习编程的网站或者个人博客&#xff0c;但是对于初学者&#xff0c;往往更希望获得那种引导性的教学&#xff1a;即一步一步的教你跟着操作的教学。这种教学最好的方式当然就是视频了。毕竟在Apple Podcast上超火爆的斯坦福教授iOS开发的课程也是这种形式…

SQL Server 2005 Express附加(Attach)的数据库为“只读”的解决方法

我的操作系统为Windows 2003 Server , 文件系统NTFS, 在SQL Server 2005 Express 上附加(Attach)从另外一台电脑Copy过来的数据库后&#xff0c;数据库为“只读”。如下图&#xff1a; 解决办法&#xff1a; 打开 SQL Server Configuration Manager, 打开SQL Server SQLEXPRESS…

[导入]blog年终小结

1. 2006-11-30 注册了本域名thws.cn&#xff0c;喜欢的thw.com被注册了&#xff0c;只好退而就其次了&#xff1b;2. 12-20在alexa上登陆站点&#xff0c;综合排名从起初490多万上升到现在的590327,下期566,880&#xff1b;3. 2007-1-11适逢google PR更新&#xff0c;PR值从0变…

Maven学习笔记(2) --mvn archetype:create 说明

前面一篇相对比较简单。 看完前面的内容我们会来到实战部分&#xff0c;也就是创建一个简单的项目 1 mvn archetype:create -DgroupIdorg.sonatype.mavenbook.ch03 \ 2 -DartifactIdsimple \ 3 -DpackageNameorg.sonatype.mavenbook 于是我们得到了步入Maven领域的第一份打击 真…

UI设计:C4D作品案例分享

中文名4D电影&#xff0c;外文名CINEMA 4D&#xff0c;研发公司为德国Maxon Computer&#xff0c;特点为极高的运算速度和强大的渲染插件&#xff0c;使用在电影《毁灭战士》、《阿凡达》中&#xff0c;获得贸易展中最佳产品’的称号&#xff0c;前身为FastRay。CINEMA 4D拥有快…

又是一个人的情人节

又是一个人的情人节 上午送完弟弟返乡的车&#xff0c;回家的心情也越来越迫切&#xff0c;很想立刻回到家里&#xff0c;和老爸老妈唠叨唠叨&#xff0c;和一年未见的堂兄弟一起喝喝酒&#xff0c;玩耍玩耍&#xff0c;那种心情真是没有办法形容&#xff0c;在我个人看来&…

C# Global.asax.cs 定时任务

定时执行更新Redis缓存操作 protected void Application_Start(object sender, EventArgs e) {Timer timer new Timer();timer.Enabled true;timer.Interval 3600000; //执行间隔时间,单位为毫秒; 这里实际间隔为1小时 timer.Start();timer.Elapsed new System.Timers.Ela…

给div拼接html 拼接字符串

简单描述&#xff1a;拼接html 拼接字符串&#xff0c;说实话&#xff0c;拼接这种东西我自己弄&#xff0c;得花费很多时间&#xff0c;主要是转义字符&#xff0c;单引号&#xff0c;双引号这种小细节调整起来比较麻烦&#xff0c;一旦疏忽多了少了一个符号&#xff0c;页面就…