shell 结构化命令之循环

在前面说到过shell-结构化命令之跳转,再来说一说循环命令的使用。

一、for命令

下面是bash shell中for命令的基本格式:

for var in list
do 
    commands
done

在每次迭代过程中,变量var会包含列表中的当前值,$var变量包含着这次迭代对应的当前列表项中的值。可以通过以下几种方式来指定列表:

读取列表中的值:
最简单的用法就是,直接指定一系列值,如下:

for1
~

读取列表中的复杂值:
我们先看以下,运行下面的脚本会输出什么:

#!/bin/bash

for test in I'm very happy today's night
do
    echo "The next string is $test"
done

可以发现,它将单引号中的字符串设别成了一个字符,所以没有达到我们想要的效果。

for2

有两种方法可以解决这个问题:

  • 使用转义字符\
  • 用双引号“ ”来定义用到的值

for循环默认认为每个值都是由空格分割的。

从变量读取值:
使用起来也是很简单的,只是先定义了一个变量,如下所示:

for3
~

从命令读取值:
如下,使用$(command)就可以将命令作为列表读入for循环中。

#!/bin/bash
for file in $(ls)
do
    echo "The file/folder is $file"
done

这里显示了当前目录下的所有文件或文件夹名。


更改字段分隔符:
有个环境变量叫做IFS(internal field separator),即内部字段分隔符。默认情况下,bash shell将空格、制表符、换行符当做字段分隔符。可以这样来修改IFS的值:IFS=,比如,我们可以使用如下代码,拆分当前路径:

#!/bin/bash

IFS.OLD=$IFS
IFS=/

for file in $(pwd)
do
    echo "The path is: $file"
done

如果想使用多个分隔符,直接将其它们在赋值行串起来即可。这里了使用IFS.OLD=$IFS;IFS=/先将默认的分隔符保存起来,使用完毕之后可以将其恢复。


使用通配符读取目录:
可以在for循环中使用通配符来处理目录中的文件。如下图所示我们匹配了用户目录下所有已test开头的文件和文件夹。

for4

稍加修改就可以完成更加强大的功能,比如遍历某个目录下的文件和目录,并用test命令将其进行分类。

注意:我们可以在数据列表中放入任何东西,比如前面说到的数值、文件和目录。


使用C语言分风格的for命令:使用双小括号
如同我们在shell-结构化命令之跳转中说到的在if语句重中使用双小括号来实现高级的数学表达式一样。for循环中也可以使用双小括号来实现C语言风格的变量引用方式(其实也类似于数学表达式),格式为for(( expression )),这里的表达式类似于C语言等语言中的。给一个简单的例子:

for5

二、while&until命令

while命令的格式如下:

while test command
do
    other commands
done

test command这里和之前if中的test命令一模一样。

until命令和while的工作方式完全相反,其格式如下:

until test commands
    other commands
done

直到test命令返回退出状态码为0时,循环才结束;退出状态码不为0时,往下执行循环。

三、break&continue命令

和其他编程语言中的完全类似:

break用于:

  • 跳出单个循环,此循环终止
  • 跳出内部循环(嵌套循环时)
  • 跳出外部循环(break n,用n指定外部循环的层级)

continue用于:

  • 提前终止某次循环,但并不会终止整个循环
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值