在前面说到过shell-结构化命令之跳转,再来说一说循环命令的使用。
一、for命令
下面是bash shell中for命令的基本格式:
for var in list
do
commands
done
在每次迭代过程中,变量var会包含列表中的当前值,$var变量包含着这次迭代对应的当前列表项中的值。可以通过以下几种方式来指定列表:
读取列表中的值:
最简单的用法就是,直接指定一系列值,如下:
~
读取列表中的复杂值:
我们先看以下,运行下面的脚本会输出什么:
#!/bin/bash
for test in I'm very happy today's night
do
echo "The next string is $test"
done
可以发现,它将单引号中的字符串设别成了一个字符,所以没有达到我们想要的效果。
有两种方法可以解决这个问题:
- 使用转义字符\
- 用双引号“ ”来定义用到的值
for循环默认认为每个值都是由空格分割的。
从变量读取值:
使用起来也是很简单的,只是先定义了一个变量,如下所示:
~
从命令读取值:
如下,使用$(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开头的文件和文件夹。
稍加修改就可以完成更加强大的功能,比如遍历某个目录下的文件和目录,并用test命令将其进行分类。
注意:我们可以在数据列表中放入任何东西,比如前面说到的数值、文件和目录。
使用C语言分风格的for命令:使用双小括号
如同我们在shell-结构化命令之跳转中说到的在if语句重中使用双小括号来实现高级的数学表达式一样。for循环中也可以使用双小括号来实现C语言风格的变量引用方式(其实也类似于数学表达式),格式为for(( expression ))
,这里的表达式类似于C语言等语言中的。给一个简单的例子:
二、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用于:
- 提前终止某次循环,但并不会终止整个循环