Linux学习总结(五十九)shell 脚本3-for while 循环

1 for 循环

语法: for 变量名 in 条件;do ...; done
举例1

#!/bin/bash
sum=0
for i in `seq 1 100`;do
sum=$[$sum+$i]
done
echo $sum

举例2
找到/123 目录下所有后缀名为.txt的文件
批量修改.txt 为.txt.bak
分析:
可以有两种办法,一种是find结合xarge命令,另一种为循环。
方法一:

#!/bin/bash
find /123/ -type f -name "*.txt" |xargs -i mv{} {}.bak

方法二:

#!/bin/bash
cd /123/
for f in `ls *.txt`;do
mv $f $f.bak
done

2 while 循环

语法: while 条件;do ... ;done

#!/bin/bash
sum=0
 i=1
    while [ $i -le 100 ]
     do
     sum=`expr $sum + $i`
     i=`expr $i + 1`
     done
echo $sum

通常我们写一个监控脚本可以用while做一个死循环。
每隔半分钟查看下系统负载,当负载高于10时发送邮件通知。

#!/bin/bash
while true
do
 load=`w|head -1|awk -F ‘load average: ‘ ‘{print $2}‘|cut -d ‘.‘ -f1`
 if [ $load -gt 10 ]
  then
  /usr/lib/zabbix/alertscripts/mail.py  [email protected]  "load is high"  "load is high: $load"
 fi
 sleep 30
done

备注:
w 命令用来查看系统负载,
head -1 显示第一行,w |head -1 等价于命令uptime
awk -F ‘load average: ‘ ‘{print $2}‘ 表示以load average: 为分隔符切割,打印第二段
cut -d ‘.‘ -f1 表示以点为切割符,打印第一段
备注:我们在load average: 后面加一个空格,得到的结果前面就不会有空格。不加空格的话,还可以再接sed去掉空格
上面命令等价于w|head -1|awk -F ‘load average:‘ ‘{print $2}‘|cut -d ‘.‘ -f1 |sed ‘s/ //‘
当负载超过10时用python脚本发邮件通知,格式为脚本后面跟邮箱名,主题,内容。
对于单个字符作为分隔符,cut可以实现awk的切割打印功能,但是cut不支持字符串作为切割符。

3 循环中的continue

忽略掉本次循环的操作,直接进入下一次循环。

#!/bin/bash
for i in `seq 1 5`;do
    if [ $i -eq 3 ];then
    continue
    fi
    echo -e "$i \c"
done

运行结果为 1 2 4 5 ,continue 成功跳过了循环变量为3的操作。

4 循环中的break

碰到break语句,直接跳出当前循环。

#!/bin/bash
for i in `seq 1 5`;do
    if [ $i -eq 4 ];then
        break
    fi
    echo $i
done

运行结果为1 2 3。当循环到4时,直接跳出循环,不再执行循环中任何语句。

5 exit 语句

碰到exit语句,直接结束脚本。

#!/bin/bash
for i in `seq 1 5`;do
    if [ $i -eq 4 ];then
    exit
    fi
    echo $i
done
echo "hello world"

执行结果为1 2 3 ,我们发现最后循环外面的echo语句也没有执行,如果把exit换成break,则会多出一句hello world

6 用while 实现的交互式重复输入案例

需求:提示用户输入数字,若不输入,则提示输入内容,若输入不是纯数字,则提示输入数字,直到正确输入为止

#!/bin/bash
while [ 1 ]
do
    read -p "please input a number:" n
    if [ -z $n ];then
    echo "please input sth"
    continue
    fi
    n1=`echo $n|sed ‘s/[0-9]//g‘`
    if [ -n "$n1" ];then
    echo "please input a pure number"
    continue
    fi
    break
done
echo $n

备注:while死循环实现重复交互,第一次if判断,当用户未输入字符时,则满足-z变量值为空的条件,并给出提示,需要输入字符。同时执行continue,循环从头开始,再次要求用户输入。
当用户输入非数字时,满足第二个if条件,给出提示,需要输入纯数字,同时执行continue,循环从头开始,再次要求用户输入。
当用户正确输入时,直接执行break语句,跳出循环,并且输出用户输入的数字。while [ 1 ] 可以换作 while : 或者while true

原文地址:http://blog.51cto.com/12606610/2126219

时间: 2024-07-31 23:46:18

Linux学习总结(五十九)shell 脚本3-for while 循环的相关文章

linux学习笔记--工程师技术:shell脚本基础

 Shell脚本 脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互) 规范Shell脚本的一般组成 #! 环境声明(Sha-Bang) # 注释文本 可执行代码 #!/bin/bash   #环境声明,声明写的脚本是bash这个程序翻译的 一.书写第一脚本程序 [[email protected] ~]# vim /root/1.sh #!/bin/bash echo hello world hostname cat  /etc/redhat-release ifconfig |

Linux学习笔记(十九)文件压缩

一.常见的压缩文件 Windows .rar .zip .7z Linux .zip,.gz,.bz2,.xz,.tar.gz,.tar.bz2,.tar.xz文件压缩可以节省内存,也可以节省传输速度 二.gzip首先创建了一个文件夹 /tmp/d6z/找了些比较大的文件写入1.txt例如find /etc/ -type f -name "*conf" -exec cat {} >> 1.txt \ :多执行几次 gzip 1.txt 就可以将文件1.txt压缩并且删除源文

JAVA学习第五十九课 — 网络编程概述

网络模型 OSI(Open System Interconnection)开放系统互连:參考模型 TCP/IP 网络通讯要素 IP地址 port号 传输协议 网络參考模型 七层OSI模型的基本概念要了解 网际层协议:包含:IP协议.ICMP协议.ARP协议.RARP协议. 传输层协议:TCP协议.UDP协议. 应用层协议:FTP.Telnet.SMTP.HTTP.RIP.NFS.DNS. 要真正实现网络通讯,首先要找到IP地址,IP地址是网络通讯的一大要素 IP地址:InetAddress 网络

Linux学习笔记<二十九>——http服务

基础概念: HTTP:Hyper Text Transfer Protocol 超文本传输协议 versions: HTTP/0.9:只接收GET一种请求方法,只支持纯文本 HTTP/1.0:支持PUT.POST.DELETE和HEAD,支持MINE HTTP/1.1:在HTTP/1.0的基础上,增加了缓存功能,支持长连接,支持管道方式同时                  发送多个请求 HTTP请求方法:获取资源的方法 HTTP/0.9:GET HTTP/1.0:PUT(修改服务器上的内容),

linux学习笔记-第十九课-LAMP之php 与 mysql 配置(三)

一.php 编译完的php,配置文件为空,我们需要将php的配置文件(php.ini)从解压的源码包中的php.ini-development(开发调试模板)和php.ini-production(生产运行模板)中复制一份到php的配置目录中,且名字改为php.ini 1 )disable_functions 配置 默认为空,修改为 disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passt

linux学习笔记-第十九课-LAMP之网站搭建(二)

一.网站搭建前提 搭建好LAMP运行环境 下载网站程序,这里以Discuz X 3.2 作为示例 Discuz 程序下载地址:    简体中文GBK http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip    繁体中文BIG5 http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_TC_BIG5.zip    简体UTF-8 http://download.comsenz.c

linux学习笔记-第十九课-LAMP之 mysql (四)

mysql日常操作指令 1 )mysql管理员密码的更改,mysql安装完毕后,管理员root的密码默认为空,需要进行修改 格式 :mysqladmin -u root password '新密码' 示例 : [[email protected] ~]# mysqladmin -u root password '123456' [[email protected] ~]# mysql -u root -p # 这时候就需要使用密码登陆mysql Enter password:          

JAVA学习笔记(五十九)- Socket编程

客户端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.UnknownHostException; /* * 客户端 */ public class Client { public static void main(String[] args) throws IOExcep

Linux学习(二十九)iptables(三)nat表的应用

需求 A机器可以访问外网,B机器和A机器处于同一个内网,现在要让B机器通过A机器访问外网. 步骤 1.为虚拟机添加一块网卡. 如果没有区段名称的话,点击'LAN区段(S)...'按钮,新建一个. 2.ifconfig -a命令可以看到刚添加进来的尚未启用的网卡: [[email protected] ~]# ifconfig -a eth1 Link encap:Ethernet HWaddr 00:0C:29:AC:CC:56 inet addr:192.168.182.130 Bcast:1

Linux 学习总结(十九)正则三剑客之grep

grep 过滤器,egrep可以理解为grep的升级版1 格式:grep [-cinvABC] 'word' filename-c:统计符合要求的行数例如 : grep -c 'root' /etc/passwdgrep -c '' /etc/passwd 统计文件总行数-i:忽略大小写-n:行号输出grep -n 'root' /etc/passwd-v 打印不符合要求的行, 补集-An 打印符合要求的行同时带上下面n行,n为数字-Bn 打印符合要求的同时带上上面n行-Cn 打印符合要求的同时