除了 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. 重新整理 .net core 实践篇————依赖注入应用之生命法则[三]

    前言 该章演示依赖注入中,对象的释放行为. 紧接上文表示,演示: services.AddSingleton<IMySingletonService, MySingletonService> ...

  2. mybatis-plus还可以这样分表

    为什么要分表 Mysql是当前互联网系统中使用非常广泛的关系数据库,具有ACID的特性. 但是mysql的单表性能会受到表中数据量的限制,主要原因是B+树索引过大导致查询时索引无法全部加载到内存.读取 ...

  3. redis中AOF和RDB的关闭方法

    redis中AOF和RDB的关闭方法   问题:当往redis中导入数据时,有时会出现redis server went away的情况: 原因: 导入的数据量太大,而内存不够(即内存1G,但数据有2 ...

  4. Paddle概述

    Paddle概述 本文结合深度学习理论与实践,使用百度飞桨平台实现自然语言处理.计算机视觉及个性化推荐等领域的经典应用. 实践部分使用飞桨深度学习开源框架,适配最新的2.0版本,默认使用动态图编程范式 ...

  5. nvJPEG Codec库

    nvJPEG Codec库 nvJPEG库是高性能的GPU加速库,用于解码,编码和转码JPEG格式的图像.nvJPEG2000库用于解码JPEG 2000格式的图像.与单CPU解码相比,依赖nvJPE ...

  6. CPU,GPU,GPGPU

    CPU,GPU,GPGPU 1.基本概念 1.1  GPU 图形处理器(bai英语:Graphics Processing Unit,缩写:GPU),又称显示核心.视觉du处理器.zhi显示芯片,是一 ...

  7. 基于Kaggle的图像分类(CIFAR-10)

    基于Kaggle的图像分类(CIFAR-10) Image Classification (CIFAR-10) on Kaggle 一直在使用Gluon's data package数据包直接获得张量 ...

  8. 容斥+dp (一)

    ARC115 E AtCoder Problem Statement Given is a sequence of \(N\) integers \(A_1\),\(A_2\),...,\(A_N\) ...

  9. Java期末考试编程题复习

    在程序中定义Person类,为该类编写如下字段.构造器.访问器.修改器和相应的其他方法.(20分) <1>在Person类中定义两个字段: 私有访问权限,类型为String的name字段: ...

  10. <题解>幻想乡战略游戏

    洛谷题目 看到题面,很容易就想到,这是要你找树上的重心,只不过这个重心是在带边权的树上 所以对于这个我们在树上找这个重心 一开始我想的是,我要更新权值,然后把每个点的答案更新一下 就取最大值,这好像是 ...