除了 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. STM32串口编程易错点

    注意   串口发送函数 使用STM官方的LIB 中的库函数发送之后 加一点延时   否则会错误  接收数据不正常 正确做法是  加上等待发送完成

  2. Swift系列十 - inout的本质

    inout是可以用来在函数内部修改外部属性内存的. 一.inout回顾 示例代码: func test(_ num: inout Int) { num = 20 } var a = 10 test(& ...

  3. xxl-job使用遇到的问题(二)

    xxl-job使用遇到的问题(二) 关联阅读 xxl-job使用遇到的问题(一) 1.问题现象 最近有个老定时任务迁移到xxl-job的时候,遇到一个小问题.虽然很快解决,但是还是有必要记录一下~ j ...

  4. mysql数据库-日志管理

    MySQL 支持丰富的日志类型 事务日志:transaction log 事务日志的写入类型为"追加",因此其操作为"顺序IO":通常也被称为:预写式日志 wr ...

  5. Day30 BigInteger和BigDecimal

    BigInteger与BigDecimal BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1.如果要表示再大的整 ...

  6. uni-app 富文本解析-小程序

    原文:http://www.upwqy.com/manual/info/105.html 1 引入插件 gaoyia-parse 链接:https://pan.baidu.com/s/1UusfXxH ...

  7. SLAM图优化g2o

    SLAM图优化g2o 图优化g2o框架 图优化的英文是 graph optimization 或者 graph-based optimization, "图"其实是数据结构中的gr ...

  8. 如何使用Nsight Compute?

    如何使用Nsight Compute? 下图command Line Argunments是指训练或测试命令,Linux下直接用测试或训练命令

  9. 【C++】Vector求最大值最小值

    最大值: int max = *max_element(v.begin(),v.end()); 最小值: int min = *min_element(v.begin(),v.end());

  10. 既然有 HTTP 请求,为什么还要用 RPC 调用?

    首先,实名赞扬题主的问题.这个问题非常好. 其次,实名反对各个上来就讲RPC好而HTTP不好的答案.因为,题主的观点非常对. HTTP协议,以其中的Restful规范为代表,其优势很大.它可读性好,且 ...