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 循环结构及相关语句综合实践
- while 循环的特长是执行守护进程,以及实现我们希望循环持续执行不退出的应用,适合用于频率小于 1min 的循环处理其他的 while 循环几乎都可以被 for 循环及定时任务 crontab 功能代替
- case 语句可以用 if 语句来替代,而在系统启动脚本时传入少量固定规则字符串的情况下,多用 case 语句,其他普通判断多用 if 语句
- 一句换场景,if 语句、for 语句最常用,其次是 while(守护进程)、case(服务启动脚本)
二. shell 脚本中各个语句的使用场景
- 条件表达式,用于简短的条件判断及输出(文件是否存在,字符串是否为空等)
- if 取值判断,多用于不同值数量较少的情况
- 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 $*
案例二:
手机充值并发送短信。这个案例并没有实际用途,可以当做一个综合练习玩玩的
以下功能:
- 充值,但重复充值金额不累计,充值后立即查询余额无法正常使用
- 发送短信,输入发送的条数和短信内容,当金额不足时,可以选择(y:充值,n:修改发送条数,o:返回菜单)
- 查询余额,只有当使用发送功能选择(o:返回菜单)时,查询才可以生常使用
- 退出,结束当前脚本
#!/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
Shell语法—— while 条件语句相关推荐
- linux while 多个条件,Shell语法—— while 条件语句
while 循环语句 while 循环语句语法格式为: while < 条件表达式 > do 指令 done 有关脚本运行的相关用法 命令 说明 sh file.sh & 把 fi ...
- shell编程之条件语句(文件测试,test命令,字符串和逻辑测试,if单支语句,if双支语句,if多支语句,case命令,用if写跑步小实验)
文章目录 shell编程之条件语句 条件测试 test命令 整数值测试 free -m 提供了更简洁的查看系统内存使用情况: 字符串和逻辑测试 字符串 逻辑测试 一元运算符,二元运算符和三元运算符 i ...
- Shell编程之条件语句(if语句,case分支语句)
Shell编程之条件语句 一.条件测试操作 1.test命令 2.文件测试 3.整数值比较 4.字符串比较 5.逻辑测试 二.if语句 单分支结构 双分支结构 多分支结构 三.case分支语句 一.条 ...
- Linux网络服务与shell脚本——Shell编程之条件语句
第八章 Shell编程之条件语句 一.条件测试 1.测试命令 (1)test 条件表达式 (2)[条件表达式] (3)$?:根据返回值判断前者是否成立 2.文件测试:根据指定路径名称,判断对应文件或目 ...
- shell脚本之条件语句
1 条件测试 1.1 Test命令 可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为 0 表示条件成立,反之不成立). 使用test命令测试时,有两种形式:(常用格式二) 格式一:te ...
- shell中的条件语句
if-elif-else-fi语句 语法如下 if pipeline [pipeline-] then statements-if-true-1 [elif pipeline [pipeline ...
- Shell脚本之——条件语句if详解
文章目录 一.test命令 1.2.格式 1.2.实例操作 二.文件测试 2.1.格式: 2.2.常用的测试操作符 2.3.实例操作 三.整数值比较 3.1.格式 3.2.常用的测试操作符 3.3.实 ...
- 你说shell编程的条件语句太难,我说那是你没看过这篇博客。
文章目录 一.条件测试操作 (一). 条件测试操作 1.test命令 (二).文件测试 1.文件测试基本格式 2.常见的测试操作符 (三).整数测试 1.整数值比较 2.常用的测试操作符 (四).字符 ...
- Shell编程之条件语句
目录 条件测试 条件测试操作-1 条件测试操作-2 条件测试操作-3 条件测试操作-4 条件测试操作-5 条件测试操作-6 条件测试操作-7 if语句的结构 单分支结 双分支结构 case语句结构 条 ...
最新文章
- WMI技术介绍和应用——执行方法
- [微信小程序]实现一个自定义遮罩层组件(完整示例代码附效果图)
- 程序员转型AI,成功几率有几分?
- java inner class,C# Inner Class vs. java 的inner class比较-JSP教程,Java技巧及代码
- java script valueof_Javascript new Date().valueOf()的作用与时间戳由来详解
- 允许用户把多个作业同时提交给计算机,2005年7月操作系统试题和答案
- ci框架去除index.php,ci框架如何隐藏index.php
- task search in offline - three filters implementation
- [css] css中最常用的字体有哪些?你是怎么选择字体的?
- CHM乱码解决方案!
- sqrt()平方根计算函数的实现1——二分法
- 用DropDownList实现的省市级三级联动
- Node介绍及环境配置~超级详细哦
- 设备唯一标志的解决方案
- 计算机网络中的www服务,计算机网络基础练习题01
- 用计算机怎么计算税率,税率计算器 个税计算器2017税率表公式
- linux源码rm函数,linux的rm命令源码
- 拍照识别植物软件app哪个好?这3个工具可以增加你的知识储备
- [Python爬虫]爬取新浪理财师股票问答
- 电大计算机基础光盘电脑安装,电大《计算机应用技术基础》第一章 计算机的硬件安装...
热门文章
- 装 linux后 win7消失了,win7系统重装后ubuntu启动消失不见的解决方法
- 为多孔介质的当量直径_新型纳米多孔碳材料在催化剂载体方面的应用
- Request请求对象
- 利用三层交换机实现VLAN间路由配置
- 全国计算机等级考试题库二级C操作题100套(第18套)
- 智能家居(工厂模式)
- linux 修改文件名_Linux常用命令
- python语言1002python语言_PYTHON语言学习
- 深大计算机科学与技术在广东省,广东考生请注意:深圳大学2021年计划本省总招生人数比例超过75%!...
- mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列