循环语句

for

语法结构

for 变量名 [ in 取值列表 ]
do
循环体
done

注意 当for对文件内容进行逐行处理时,会忽略空行

示例

例1

ping 主机的脚本(初始版):缺点执行过程慢,Ctrl+C只能结束某一个循环,并不能结束脚本

[root@hadoop04 shell_for]# vim ping.sh
#!/usr/bin/bash
##########################################
# ping test #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## reset_col="\e[0m"
red_col="\e[31m"
green_col="\e[32m" # 通过输出重定向,在ping之前清理ip_up.txt和ip_down.txt的内容
>ip_up.txt
>ip_down.txt # 产生序列有两种方式
# {n..m}
# `seq n m`
# n<m
for i in `seq 200`
for i in `seq 200`
do
ip=172.22.34.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ $? -eq 0 ];then
echo -e "${green_col}${ip} is up${reset_col}" | tee -a ip_up.txt
else
echo -e "${red_col}${ip} is down${reset_col}" | tee -a ip_down.txt
fi
done

例2

ping 主机的脚本(改进版):每一个循环放入一个子shell中执行,可以大大地加快脚本执行的速度

注意 1.将循环放到后台运行 {}& 2.wait 3.执行脚本前清理文件内容

[root@hadoop04 shell_for]# vim ping01.sh
#!/usr/bin/bash
##########################################
# ping test #
# v1.1 by ElegantSmile 9/12/2019 #
########################################## # 通过输出重定向,在ping之前清理ip_up.txt和ip_down.txt的内容
>ip_up.txt
>ip_down.txt reset_col="\e[0m"
red_col="\e[31m"
green_col="\e[32m" for i in `seq 100 200`
do
# 将循环放到后台进程执行
{
ip=172.22.34.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ $? -eq 0 ];then
echo -e "${green_col}${ip} is up${reset_col}" | tee -a ip_up.txt
else
echo -e "${red_col}${ip} is down${reset_col}" | tee -a ip_down.txt
fi
}&
done #等待前面的所有后台进程结束
wait echo "finish..."

两个版本的脚本执行时间比较

改进版

[root@hadoop04 shell_for]# time bash ping01.sh
(略)
finish... real 0m1.208s
user 0m0.338s
sys 0m0.781s

初始版

[root@hadoop04 shell_for]# time bash ping.sh
(略) real 2m16.459s
user 0m0.277s
sys 0m0.677s

例3

ping 指定主机

# 指定主机的IP地址
[root@hadoop04 shell_for]# vim ip.txt
172.22.34.18
172.22.34.89
172.22.34.56
172.22.34.192
172.22.34.94
172.22.34.243 # 编写脚本
[root@hadoop04 shell_for]# vim ping02.sh
#!/usr/bin/bash
##########################################
# ping test #
# v1.2 by ElegantSmile 9/12/2019 #
########################################## ip_txt=$1 reset_col="\e[0m"
red_col="\e[31m"
green_col="\e[32m" for ip in `cat ${ip_txt}`
do
{
ping -c1 ${ip} &> /dev/null
if [ $? -eq 0 ];then
echo -e "${green_col}${ip} is up${reset_col}"
else
echo -e "${red_col}${ip} is down${reset_col}"
fi
}&
done wait echo "finish..." # 执行脚本
[root@hadoop04 shell_for]# time bash ping02.sh ip.txt
172.22.34.18 is up
172.22.34.56 is down
172.22.34.192 is down
172.22.34.94 is down
172.22.34.243 is down
172.22.34.89 is down
finish... real 0m3.018s
user 0m0.008s
sys 0m0.017s

例4

创建用户,输入前缀、密码、数量;确认输入的信息;根据用户存在与否,提示已经存在或者创建用户

[root@hadoop04 shell_for]# vim create_user01.sh
!/usr/bin/bash
##########################################
# add user #
# v1.0 by ElegantSmile 9/12/2019 #
########################################## while :
do
read -p "Please enter prefix & password & num[tianyun 123 5]" prefix pass num printf "user information:
--------------------------
user prefix: ${prefix}
user password: ${pass}
user number: ${num}
--------------------------
" read -p "Are you sure?[y|n]: " action if [ "${action}" = "y" ];then
break
fi
done # seq -w 等位补齐
for i in `seq -w ${num}`
do
username=${prefix}${i}
id ${username} &> /dev/null
if [ $? -eq 0 ];then
echo "user ${username} already exists"
else
useradd ${username}
echo "${pass}" | passwd --stdin ${username} &> /dev/null
if [ $? -eq 0 ];then
echo "user ${username} is created"
fi
fi
done

例5

创建用户,通过文件指定要创建的用户和密码

# 编辑用户信息文件user.txt
[root@hadoop04 shell_for]# vim user.txt
alice 123123
jeve 7dsgf9 # 编写脚本
[root@hadoop04 shell_for]# vim create_user02.sh
#!/usr/bin/bash
##########################################
# add user #
# v1.1 by ElegantSmile 10/12/2019 #
########################################## # 执行脚本时,必须传入一个参数
if [ $# -eq 0 ];then
echo "usage: `basename $0` file"
exit 1
fi # 执行脚本时,必须传入一个参数
if [ $# -eq 0 ];then
echo "usage: `basename $0` file"
exit 1
fi # 执行脚本时,传入的参数必须是文件
if [ ! -f $1 ];then
echo "error file"
exit 2
fi # 定义变量
user_text=$1 #IFS 内部字段分隔符
IFS=$'\n' for line in `cat "${user_text}"`
do
# 获取指定用户的用户名和密码
username=`echo "${line}" | awk '{print $1}'`
userpass=`echo "${line}" | awk '{print $2}'`
id ${username} &> /dev/null
if [ $? -eq 0 ];then
echo "user ${username} already exists"
continue
fi
useradd ${username} &> /dev/null && echo "${userpass}" | passwd --stdin ${username} &> /dev/null
if [ $? -eq 0 ];then
echo "user ${username} is created"
echo "userpassword: ${userpass}"
fi
done

例6

批量修改主机密码

while

语法结构

while 条件测试
do
循环体
done
==当条件测试成立(条件测试为`真`),执行循环体

注意

☆☆☆当需要对文件内容进行逐行处理时,推荐使用:

while read line

do

循环体

done < FILE

示例

例1

创建用户,通过用户列表文件创建用户

# 编辑用户信息文件user.txt
[root@hadoop04 shell_while]# vim user.txt
alice 123123
jeve 7dsgf9 # 编写脚本
[root@hadoop04 shell_while]# vim create_user01.sh #!/usr/bin/bash
##########################################
# add user #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## while read userinfo
do
if [ ${#userinfo} -eq 0 ] ;then
echo "Nothing to do"
continue
fi
username=`echo "${userinfo}" | awk '{print $1}'`
userpass=`echo "${userinfo}" | awk '{print $2}'`
id "${username}" &> /dev/null
if [ $? -eq 0 ];then
echo "user ${username} already exists" else
useradd ${username} &> /dev/null && echo "${userpass}" | passwd --stdin ${username} &> /dev/null
if [ $? -eq 0 ];then
echo "user ${username} is created"
echo "userpassword: ${userpass}"
echo "username: ${username}"
fi
fi done < user.txt echo "all ok..."

until

语法结构

until 条件测试
do
循环体
done
==当条件测试成立(条件测试为`假`),执行循环体

示例

ping主机,检查IP状态

# while循环
# ip ping不通时提示
# 类似于下线提示
[root@hadoop04 shell_until]# vim ping01.sh
#!/usr/bin/bash
##########################################
# ping hosts #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## ip=$1 while ping -c1 -W1 ${ip}&> /dev/null:
do
sleep 1
done echo "${ip} is down" # until循环
# ip ping得通时提示
# 类似于上线提示
[root@hadoop04 shell_until]# vim ping02.sh
#!/usr/bin/bash
##########################################
# ping hosts #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## ip=$1 until ping -c1 -W1 ${ip}&> /dev/null:
do
sleep 1
done echo "${ip} is up"

For While Until对比

循环次数固定的  --> for

循环次数不固定的  --> while until

对文件逐行处理  --> while

ping主机探测

循环次数固定的ping主机探测

For

[root@hadoop04 shell_for_while_until]# vim for_while_until_ping.sh
#!/usr/bin/bash
##########################################
# ping hosts #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## for i in {2..254}
do
{
ip=172.22.145.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ $? -eq 0 ];then
echo "${ip} is up"
fi
} &
done wait echo "all finish..."

While

[root@hadoop04 shell_for_while_until]# vim while_until_for_ping.sh
#!/usr/bin/bash
##########################################
# ping hosts #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## i=2 while [ $i -le 254 ]
do
{
ip=172.22.145.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ $? -eq 0 ];then
echo "${ip} is up"
fi
} &
let i++
done wait echo "all finish..."

Until

[root@hadoop04 shell_for_while_until]# vim until_for_while_ping.sh
#!/usr/bin/bash
##########################################
# ping hosts #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## i=2 until [ $i -gt 254 ]
do
{
ip=172.22.145.${i}
ping -c1 -W1 ${ip} &> /dev/null
if [ $? -eq 0 ];then
echo "${ip} is up"
fi
} &
let i++
done wait echo "all finish..."

计算1-100的和

For

[root@hadoop04 shell_for_while_until]# vim for_while_until_sum100.sh
#!/usr/bin/bash
##########################################
# sum 100 #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## for i in {1..100}
do
#let sum=${sum}+${i}
let sum+=${i}
done echo "sum: ${sum}"

While

[root@hadoop04 shell_for_while_until]# vim while_until_for_sum100.sh
#!/usr/bin/bash
##########################################
# sum 100 #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## i=1 while [ ${i} -le 100 ]
do
#let sum=${sum}+${i}
let sum+=${i}
let i++
done echo "sum: ${sum}"

Until

[root@hadoop04 shell_for_while_until]# vim until_for_while_sum100.sh
#!/usr/bin/bash
##########################################
# sum 100 #
# v1.0 by ElegantSmile 10/12/2019 #
########################################## i=1 until [ ${i} -gt 100 ]
do
#let sum=${sum}+${i}
let sum+=${i}
let i++
done echo "sum: ${sum}"

05Shell循环语句的更多相关文章

  1. 【python之路4】循环语句之while

    1.while 循环语句 #!/usr/bin/env python # -*- coding:utf-8 -*- import time bol = True while bol: print '1 ...

  2. python之最强王者(3)——变量,条件、循环语句

    1.Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的 ...

  3. #9.5课堂JS总结#循环语句、函数

    一.循环语句 1.for循环 下面是 for 循环的语法: for (语句 1; 语句 2; 语句 3) { 被执行的代码块 } 语句 1 在循环(代码块)开始前执行 语句 2 定义运行循环(代码块) ...

  4. 详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  5. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  6. python3循环语句while

    Python的循环语句有for和while语句,这里讲while语句. Python中while语句的一般形式: while 条件判断 : 语句 需要注意冒号和缩进.另外,注意Python中没有do. ...

  7. 20.SqlServer中if跟循环语句

    --if语句declare @i int begin print @i end else --循环语句 declare @i int begin insert into grade(classname ...

  8. Python学习【第五篇】循环语句

    Python循环语句 接下来将介绍Python的循环语句,程序在一般情况下是按顺序执行的. 编程语言提供了各种控制结构,允许更复杂的执行路径. 循环语句允许我们执行一个语句或语句组多次. Python ...

  9. iOS -Swift 3.0 -for(循环语句用法)

    // // ViewController.swift // Swift-循环语句 // // Created by luorende on 16/12/08. // Copyright © 2016年 ...

随机推荐

  1. Git入门基础教程

    目录 一.Git的安装 1.1 图形化界面 1.2 命令行界面 二.本地仓库的创建与提交 2.1 图形化界面 2.1.1 首先在电脑上有一个空白目录 2.1.2 打开SourceTree 2.1.3 ...

  2. GUI程序分析实例

    GUI程序开发概述 GUI程序开发原理 GetMessage(&msg)将消息队列中的消息取出来,在循环中进行处理. GUI程序开发的本质

  3. [考试反思]1113csp-s模拟测试113:一念

    在这么考下去可以去混女队了2333 两天总分rank14,退役稳稳的 的确就是没状态.满脑子都是<包围保卫王国>ddp/LCT/ST,没好好考试. 我太菜了写题也写不出来考试也考不好(显然 ...

  4. Pipe——高性能IO(三)

    Pipelines可以替换掉那些丑陋的封装(kludge).变通(workaround)或妥协(compromise)——用一个在框架中设计优雅的专门的解决方案. 敢肯定,下面所覆盖的那些痛点,对于那 ...

  5. 图解SynchronousQueue原理-公平模式

    SynchronousQueue原理详解-公平模式 一.介绍 SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对Sync ...

  6. 在windows桌面上创建一个文件夹

    用dos命令创建 md [文件路径][文件名] C:\Users\admin>md  C:\Users\admin\desktop\test 刷新一下桌面,就可以看见桌面上创建了一个名为test ...

  7. CSAPP lab1——位运算

    本次为一次计算机系统实验,就是使用一些基本的运算符来实现函数功能. ps做这些题让我想起大一上学期刚学二进制时被鹏哥支配的痛苦. 知识准备: 1.负数等于正数取反加一. 2.左移一位相当于将这个数扩大 ...

  8. centOS如何灵活管理服务进程

     1.将程序跑起来,且关闭会话时程序仍在运行. nohup node index.js & (头部加了nohup,表示在你退出帐户或关闭终端之后继续运行相应的进程;尾部的&表示在后台执 ...

  9. JS 错误

    JS 错误 try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. 错误一定会发生 当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错 ...

  10. 一文解读MVC/MVP/MVVM (转)

    这篇文章对目前 GUI 应用中的 MVC.MVP 和 MVVM 架构模式进行详细地介绍. MVC 在整个 GUI 编程领域,MVC 已经拥有将近 50 年的历史了.早在几十年前,Smalltalk-7 ...