除了 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. LTC4020

    今天凯哥说他之前有一块电池放电低于20V了 然后接上4020后 会先浮充   涓流充 大约200ma  充过了20V后又是4A了

  2. PCB布线规范

    模拟电路和数字电路PCB设计的不同点 http://linear.eefocus.com/module/forum/thread-593593-1-1.html 合集   PCB给种设计资料 http ...

  3. ES6笔记2

    ES6笔记2 Promise Promise 是 ES6 引入的异步编程的新解决方案,语法上是一个构造函数 一共有3种状态,pending(进行中).fulfilled(已成功)和rejected(已 ...

  4. week-03

    1.简述HTTP交互原理 1.浏览器分析输入访问的地址 域名(IP)+$uri 2.读取浏览器缓存 3.请求DNS服务器,解析域名,返回IP 4.建立TCP连接,三次握手 5.发送请求 6.接收返回请 ...

  5. IDEA debug ConcurrentLinkedQueue时抽风

    1. 介绍 如标题所见,我在使用IDEA debug ConcurrentLinkedQueue的Offer方法时,发生了下面的情况. 代码如下: ConcurrentLinkedQueue<s ...

  6. 重新整理 .net core 实践篇—————3种配置验证[十四]

    前言 简单整理一些配置的验证. 正文 配置的验证大概分为3类: 直接注册验证函数 实现IValidteOptions 使用Microsoft.Extensions.Options.DataAnnota ...

  7. 树莓派3B+常用操作

    安装Docker 替换成清华源 清华源地址https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/ echo "deb [arch=armhf ...

  8. CodeGen编写自定义表达式标记

    CodeGen编写自定义表达式标记 CodeGen支持开发人员通过编写plug-in modules插件模块来定义自定义表达式标记的能力,以提供与这些标记相关联的逻辑.这种plug-in module ...

  9. javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  10. java后端知识点梳理——web安全

    跨域 当浏览器执行脚本时会检查是否同源,只有同源的脚本才会执行,如果不同源即为跨域. 这里的同源指访问的协议.域名.端口都相同. 同源策略是由 Netscape 提出的著名安全策略,是浏览器最核心.基 ...