除了 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 是一个初始化语句,仅在第一次循环时执行。
|
- #!/bin/bash
- sum=0
- for ((i=1; i<=100; i++))
- do
- ((sum += i))
- done
- echo "The sum is: $sum"
运行结果: The sum is: 5050
|
省略exp1的实例
- #!/bin/bash
- sum=0
- i=1
- for ((; i<=100; i++))
- do
- ((sum += i))
- done
- echo "The sum is: $sum"
可以看到,将i=1 移到了 for 循环的外面
|
|
|
- #!/bin/bash
- sum=0
- for ((i=1; ; i++))
- do
- if(( i>100 )); then
- break
- fi
- ((sum += i))
- done
- echo "The sum is: $sum"
省略 exp2,没有了判断条件,如果不作其他处理就会成为死循环,因此可以在循环体内部使用 break 关键字强制结束循环
|
省略exp3的实例
- #!/bin/bash
- sum=0
- for ((i=1; i<=100; ))
- do
- ((sum += i))
- ((i++))
- done
- echo "The sum is: $sum"
省略了 exp3,就不会修改 exp2 中的变量,这时可在循环体中加入修改变量的语句。 |
Python语言风格 |
for var in val_list do statements done
- var表示变量,val_list表示取值列表
- in val_list部分可以省略,省略后的效果类似于in $@
它的运行过程为:
- 1)每次循环都会从 val_list 中取出一个值赋给变量 var
- 2)进入循环体,执行循环体中的 statements。
- 3)直到取完 value_list 中的所有值,循环结束
各种val_list:
- 直接给出具体的值
- 给出一个范围
- 使用命令产生的结果
- 使用通配符
- 使用特殊变量
|
在 in 关键字后面直接给出具体的值,多个值之间以空格分隔,比如1 2 3 4 5 、"abc" "390" "tom" 等
- #!/bin/bash
- sum=0
- for n in 1 2 3 4
- do
- echo $n
- ((sum+=n))
- done
- echo "The sum is "$sum
运行结果: 1 2 3 4 The sum is 10
|
给出一个取值范围,格式为:{start..end},注意中间用两个点号相连,该形式只支持数字和字母。
- #!/bin/bash
- sum=0
- for n in {1..100}
- do
- ((sum+=n))
- done
- echo $sum
运行结果: 5050
输出从 A 到 z 之间的所有字符:
- #!/bin/bash
- for c in {A..z}
- do
- printf "%c" $c
- done
输出结果: ABCDEFGHIJKLMNOPQRSTUVWXYZ
[]^_`abcdefghijklmnopqrstuvwxyz 可以发现,Shell 是根据 ASCII 码表来输出的。
|
|
|
使用命令的执行结果
求偶数和
- #!/bin/bash
- sum=0
- for n in $(seq 2 2 100)
- do
- ((sum+=n))
- done
- echo $sum
运行结果: 2550
seq 是一个 Linux 命令,用来产生某个范围内的整数,并且可以设置步长。
seq 2 2 100 表示从 2 开始,每次增加 2,到 100 结束。
|
使用shell通配符
使用通配符时,不适用ls命令也可查看当前目录下的文件
- #!/bin/bash
- for filename in *.sh
- do
- echo $filename
- done
运行结果: demo.sh test.sh abc.sh
|
|
|
使用特殊变量,如 $#、$*、$@、$?、$$ 等
在函数中
- #!/bin/bash
- function func(){
- for str in $@
- do
- echo $str
- done
- }
- func C++Java Python
运行结果: C++ Java Python
|
使用特殊变量,如 $#、$*、$@、$?、$$ 等
省略 val_list,省略后的效果和使用$@ 一样
- #!/bin/bash
- function func(){
- for str
- do
- echo $str
- done
- }
- func C++ Java Python
运行结果: C++ Java Python
|
最新文章
- TFS二次开发系列:六、TFS的版本控制
- pt-online-schema-change 修改主键导致数据删除失败的问题调查
- CareerCup All in One 题目汇总 (未完待续...)
- CentOS7 Mini安装Oracle后用PL/SQL连接数据库(图形化安装)
- FastReport报表控件使用技巧总结
- WCF初探-17:WCF数据协定之等效性
- poj 1458 Common Subsequence
- MVC的处理过程
- 实现js中的重载
- (六)6.14 Neurons Networks Restricted Boltzmann Machines
- oracle——表修改语句集合
- java对cookie的操作_01
- linux eclipse c++配置
- RadioGroup单选按钮排版
- database schema
- Redis学习笔记(二)-key相关命令【转载】
- RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版)
- vue SSR : 原理(一)
- CF1139A Even Substrings
- 【微信公众号开发】【13】批量导出公众号所有用户信息到Excel
热门文章
- 6.2 gzip:压缩或解压文件
- 如何彻底禁止 macOS Big Sur 自动更新,去除更新标记和通知
- SystemML大规模机器学习,优化算子融合方案的研究
- GPU上如何优化卷积
- C#中使用swagger小技巧
- 1-3. SpringBoot基础,Java配置(全注解配置)取代xml配置
- 狂神说Mybatis笔记
- 如果在num1的任何位置有一个数字的连续三倍,并且在num2中有一个数字的连续两倍,则返回1。 如果不是这样,则返回0
- IDEA HTTP Client(史上最全)
- 选择合适Redis数据结构,减少80%的内存占用