Shell for循环语句

举报
AnRFDev 发表于 2021/06/19 21:53:06 2021/06/19
【摘要】 Shell脚本for循环语句写法。介绍几种常见的for循环用法。for in,for((i=1;i<=3;i++)),或者是字符串。

Shell里的for循环语句写法。我们分别用命令行和shell脚本来进行演示。

常见的一种for结构如下。for里面要跟着dodone关键字。

for i in {1..3}
do
    echo YES $i # 这里是循环体
done

数字范围

数字范围,例如从1到3,从1到100。

for in

for in 的写法,定义i为变量,使用大括号来指定范围。范围的数字之间有2个点..。例如{1..3}

$ for i in {1..3};do echo now is $i; done
now is 1
now is 2
now is 3

上面是命令行,一行把所有的指令写完。也可以再加一行代码,同样用分号;来分隔。

$ for i in {1..3};do echo now is $i;echo rustfisher.com; done
now is 1
rustfisher.com
now is 2
rustfisher.com
now is 3
rustfisher.com

或者写成脚本。其实就是拆成几行。

#!/bin/bash  

for i in {1..3}
do
    echo now is $i
    echo rustfisher.com
done

前面我们用的是大括号来指定循环范围。我们也可以用$(seq 1 3)
开头依旧是for i in

$ for i in $(seq 1 3);do echo now is $i;echo rustfisher.com; done
now is 1
rustfisher.com
now is 2
rustfisher.com
now is 3
rustfisher.com

写成脚本如下

#!/bin/bash  

for i in $(seq 1 3)
do 
    echo now is $i
    echo rustfisher.com
done

for((i=1;i<=3;i++))

我们也可以写成像Java/C语言里的for循环那样。但要注意这里的for有2层小括号。

$ for((i=1;i<=3;i++));do echo -n now is [$i] ;echo rustfisher.com; done
now is [1]rustfisher.com
now is [2]rustfisher.com
now is [3]rustfisher.com

更改一下步进值,改为i+=2

for((i=1;i<=3;i+=2));do echo -n now is [$i] ;echo rustfisher.com; done
now is [1]rustfisher.com
now is [3]rustfisher.com

或者加上一些小运算,用expr加上我们想要的运算。注意$i\*3之间要有空格。

$ for((i=1;i<=3;i+=2));do echo -n $(expr $i \* 3) ' ' ;echo rustfisher.com; done
3  rustfisher.com
9  rustfisher.com

后面加的空格是为了隔开好看一些。

在shell脚本中,我们有时候会定义变量。变量也可以作为for循环的范围。

#!/bin/bash  

startNum=1
endNum=3

for i in $(seq $startNum $endNum)
do
    echo current is $i
done

我们定义2个变量startNumendNum。要使用它们的值时,需要加上$符号。

字符循环

for循环可以与一些指令结合起来,获取指令中的结果。

for i in ls

先用命令行看一个效果,for与ls结合使用

$ for i in `ls`; do echo $i ; done
for1.sh

当前目录里只有1个文件。

如果是ls -a命令,输出会更多。

$ for i in `ls -a`; do echo $i ; done
.
..
for1.sh

换一个目录,我们可以输出所有png文件的文件名

$ for i in `ls *.png`; do echo $i ; done
android-cover-2.png
fish.png
ic_book_blue.png
ic_tools_gear.png
ic_web.png
kotlin-android-1.png
python-logo.png
ts-blue-1.png

for i in ll

换成ll命令,输出更加丰富

$ for i in `ll`; do echo $i ; done
total
8
-rw-r--r--
1
rustfisher
staff
183
6
19
21:25
for1.sh

我们知道ll命令会输出当前目录下的文件信息

$ ll
total 8
-rw-r--r--  1 rustfisher  staff  183  6 19 21:25 for1.sh

结合for循环可以看出,for循环是获取了空格或换行为间隔的字符串。

字符串变量

那么我们可以在脚本中尝试一些,for循环配合字符串

#!/bin/bash  

word="Welcome      to rustfisher.com"
for i in $word
do
    echo $i
done

word中间有很多个空格,但输出的依旧是这3行。

Welcome
to
rustfisher.com

进一步扩展,定义3个变量,都作为for in的参数

#!/bin/bash  

word1="Welcome        to rustfisher.com"
word2="Hello world"
word3="我很好"
for i in $word1 $word2 $word3
do
    echo $i
done

输出

Welcome
to
rustfisher.com
Hello
world
我很好

目录

例如查找某个目录下的文件。

当前目录中有一个img目录,里面有一些图片。我们在for in 后面用img/*来表示查找这个目录中所有文件。

$ for i in img/*; do echo $i ; done
img/android-2botsm.jpg
img/android-cover-2.png

如果只想看png文件,路径写为img/*.png

$ for i in img/*.png; do echo $i ; done
img/android-cover-2.png

从上面的例子可以看出,for in结构用的十分频繁。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。