除了 while 循环和 until 循环,Shell 脚本中还有for 循环,for 循环有两种使用形式:C语言风格的for循环Python语言风格的for in循环,两种形式的for循环用法对比如下:

for循环 用法 实例1 实例2
C语言风格

for((exp1; exp2; exp3))
do
    statements
done

exp1/exp2/exp3分别代表初始化语句、判断条件、自增或自减,三者皆可省略,但是分号(;)必须保留

它的运行过程为:

  • 1) 先执行 exp1。
  • 2) 再执行 exp2,如果它的判断结果是成立的,则执行循环体中的语句,否则结束整个 for 循环。
  • 3) 执行完循环体后再执行 exp3。
  • 4) 重复执行步骤 2) 和 3),直到 exp2 的判断结果不成立,就结束循环。
  • exp1 是一个初始化语句,仅在第一次循环时执行。
  1. #!/bin/bash
  2. sum=0
  3. for ((i=1; i<=100; i++))
  4. do
  5. ((sum += i))
  6. done
  7. echo "The sum is: $sum"

运行结果:
The sum is: 5050

省略exp1的实例

  1. #!/bin/bash
  2. sum=0
  3. i=1
  4. for ((; i<=100; i++))
  5. do
  6. ((sum += i))
  7. done
  8. echo "The sum is: $sum"

可以看到,将i=1移到了 for 循环的外面

   
  1. #!/bin/bash
  2. sum=0
  3. for ((i=1; ; i++))
  4. do
  5. if(( i>100 )); then
  6. break
  7. fi
  8. ((sum += i))
  9. done
  10. echo "The sum is: $sum"

省略 exp2,没有了判断条件,如果不作其他处理就会成为死循环,因此可以在循环体内部使用 break 关键字强制结束循环

省略exp3的实例

  1. #!/bin/bash
  2. sum=0
  3. for ((i=1; i<=100; ))
  4. do
  5. ((sum += i))
  6. ((i++))
  7. done
  8. echo "The sum is: $sum"

省略了 exp3,就不会修改 exp2 中的变量,这时可在循环体中加入修改变量的语句。

Python语言风格

for var in val_list
do
    statements
done

  1. var表示变量,val_list表示取值列表
  2. in val_list部分可以省略,省略后的效果类似于in $@

它的运行过程为:

  • 1)每次循环都会从 val_list 中取出一个值赋给变量 var
  • 2)进入循环体,执行循环体中的 statements。
  • 3)直到取完 value_list 中的所有值,循环结束

各种val_list:

  • 直接给出具体的值
  • 给出一个范围
  • 使用命令产生的结果
  • 使用通配符
  • 使用特殊变量

在 in 关键字后面直接给出具体的值,多个值之间以空格分隔,比如1 2 3 4 5"abc" "390" "tom"

  1. #!/bin/bash
  2. sum=0
  3. for n in 1 2 3 4
  4. do
  5. echo $n
  6. ((sum+=n))
  7. done
  8. echo "The sum is "$sum

运行结果:
1
2
3
4
The sum is 10

给出一个取值范围,格式为:{start..end},注意中间用两个点号相连,该形式只支持数字和字母

  1. #!/bin/bash
  2. sum=0
  3. for n in {1..100}
  4. do
  5. ((sum+=n))
  6. done
  7. echo $sum

运行结果:
5050

输出从 A 到 z 之间的所有字符:

  1. #!/bin/bash
  2. for c in {A..z}
  3. do
  4. printf "%c" $c
  5. done

输出结果:
ABCDEFGHIJKLMNOPQRSTUVWXYZ

[]^_`abcdefghijklmnopqrstuvwxyz
可以发现,Shell 是根据 ASCII 码表来输出的。

   

使用命令的执行结果

求偶数和

  1. #!/bin/bash
  2. sum=0
  3. for n in $(seq 2 2 100)
  4. do
  5. ((sum+=n))
  6. done
  7. echo $sum

运行结果:
2550

seq 是一个 Linux 命令,用来产生某个范围内的整数,并且可以设置步长。

seq 2 2 100表示从 2 开始,每次增加 2,到 100 结束。

使用shell通配符

使用通配符时,不适用ls命令也可查看当前目录下的文件

  1. #!/bin/bash
  2. for filename in *.sh
  3. do
  4. echo $filename
  5. done

运行结果:
demo.sh
test.sh
abc.sh

   

使用特殊变量,如 $#、$*、$@、$?、$$ 等

在函数中

  1. #!/bin/bash
  2. function func(){
  3. for str in $@
  4. do
  5. echo $str
  6. done
  7. }
  8. func C++Java Python

运行结果:
C++
Java
Python

使用特殊变量,如 $#、$*、$@、$?、$$ 等

省略 val_list,省略后的效果和使用$@一样

  1. #!/bin/bash
  2. function func(){
  3. for str
  4. do
  5. echo $str
  6. done
  7. }
  8. func C++ Java Python

运行结果:
C++
Java
Python

15 shell for循环的更多相关文章

  1. Shell 编程 循环语句

    本篇主要写一些shell脚本循环语句的使用. for 循环 指定次数 #!/bin/bash for ((i=1;i<=10;i++)) do echo $i done [root@localh ...

  2. Shell双重循环、图形排列及九九乘法表

    Shell双重循环.图形排列及九九乘法表 目录 Shell双重循环.图形排列及九九乘法表 一.双重循环 1. 双重循环概述 2. 双重循环结构 二.循环特殊操作 1. exit 2. break 3. ...

  3. Linux Shell系列教程之(十二)Shell until循环

    本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环和Lin ...

  4. shell for循环+case的脚本(监控程序状态)

    分享一个shell for循环+case的脚本(监控程序状态) 分享一个for循环+case的脚本(监控程序状态并执行相关操作) ,供大家学习参考. 复制代码代码如下: #/bin/bash set ...

  5. shell 各种循环判断

    shell支持的循环有 Shell if else Shell case esac Shell for循环 Shell while循环 Shell until循环

  6. shell脚本--循环结构

    shell的循环结构有while和for两种 for循环 #!/bin/bash #文件名:test.sh i=4 for i in 2 4 6 8 10 do echo $i done echo $ ...

  7. Linux Shell系列教程之(十一)Shell while循环

    本文是Linux Shell系列教程的第(十一)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上一篇Linux Shell系列教程之(十)Shell for循环中,我们已经 ...

  8. Linux Shell系列教程之(十)Shell for循环

    本文是Linux Shell系列教程的第(十)篇,更多Linux Shell教程请看:Linux Shell系列教程 基本任何语言都有自己的循环语句,Shell当然也不例外,今天就为大家介绍下Shel ...

  9. shell脚本-循环选择语句

    shell脚本-循环选择语句 过程式编程语言: 顺序执行 选择执行 循环执行 注:条件中的变量,可以在执行语句中使用,不用在加上"$". if语句 根据命令的退出状态来执行命令 单 ...

随机推荐

  1. linux中级之keepalived概念

    一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...

  2. 05丨实验:安装MongoDB

    https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 源码安装 export PATH=$PATH:/data/mo ...

  3. 10.4 route:显示或管理路由表

    route命令 可以显示或管理Linux系统的路由表,route命令设置的路由主要是静态路由. 路由的概念     计算机与计算机之间的数据传输必须得经由网络,而网络可以通过直接连接两台计算机的方式或 ...

  4. Spring的controller接受Date类型数据,接受枚举类型数据

    1. Controller接收Date类型的数据 核心使用@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 来将传递过来的时间字符串 ...

  5. 3 Python相对路径地址的的一个问题

    构建程序xiaojie_test.py import os from xxx.yyy import test test() 同目录下构建一个目录xxx,并且目录中有/tmp/results/graph ...

  6. 汽车HUD(Head-up Display)的技术难点

    汽车HUD(Head-up Display)的技术难点 首先解析一下HUD是什么原理吧.其实就是把车的前挡风玻璃当成反射镜,在驾驶员人眼前投射一个仪表盘的虚像.图像本身来自下方的电子发光屏,发出仪表盘 ...

  7. 硬件安全模块如何启用AUTOSAR

    硬件安全模块如何启用AUTOSAR How hardware security modules enable AUTOSAR 越来越复杂的软件和车内连接需要越来越多的加密保护.这种保护也必须由经典的实 ...

  8. 孟老板 BaseAdapter封装 (三) 空数据占位图

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  9. 如何查看app启动的activity

    adb 查看 使用adb shell 进入安卓的linux系统 拿QQ做例子: monkey -p com.tencent.mobileqq -v -v 1 #启动一次 启动页面为:com.tence ...

  10. spring如何集成第三方框架? 比如mybatis

    实体Bean的创建: 1: 基于class构建, 2: 构造方法构建 3: 静态工厂方法创建 4: FactoryBean构建 spring如何集成第三方框架? 比如mybatis 在mybatis中 ...