首页 理论教育 for循环基本语法格式及例子

for循环基本语法格式及例子

时间:2023-11-18 理论教育 版权反馈
【摘要】:for循环的基本语法格式为:或者为:for循环的流程如图6-1所示。图6-1 for循环流程图下面的例子是对4个人依次问候早安,循环4次。上面关于for循环的例子中,变量列表中的元素间的分隔符是空格,实际上分隔符可以通过IFS来定义。如下脚本先打印搜索路径,再按照先后顺序将每个路径显示出来:运行for_path.sh,得到了预期的结果:如果循环变量的取值是连续的,如取1到6,则可以用{1..6}表示。省略以后,“for变量”等同于“for变量in"$@"”。

for循环基本语法格式及例子

for循环的基本语法格式为:

978-7-111-48202-4-Chapter06-1.jpg

或者为(在一行之内写for循环时注意,关键字do和done前面的分号不能省略):

978-7-111-48202-4-Chapter06-2.jpg

for循环的流程如图6-1所示。

978-7-111-48202-4-Chapter06-3.jpg

图6-1 for循环流程图

下面的例子是对4个人依次问候早安,循环4次。变量name的值在4次循环当中依次是Tom、Jack、Harry和Merry。

978-7-111-48202-4-Chapter06-4.jpg

运行该脚本,得到输出如下:

978-7-111-48202-4-Chapter06-5.jpg

for循环的变量列表还可以来自文件:

978-7-111-48202-4-Chapter06-6.jpg

脚本for_cat.sh中,使用了命令替换功能,将catname_list.txt的输出作为for循环的变量列表:

978-7-111-48202-4-Chapter06-7.jpg

执行脚本for_cat.sh,效果与脚本for_loop.sh相同:

978-7-111-48202-4-Chapter06-8.jpg

for循环也可以在命令行直接输入执行,不是必须放在一个脚本里面。下例打印出1到5:

978-7-111-48202-4-Chapter06-9.jpg

>为系统给出的续行提示符。若for循环可以在一行之内输入,就“不用麻烦”系统给出续行提示符了,如:

978-7-111-48202-4-Chapter06-10.jpg

当for命令很长时,虽然仍旧可以在一行之内输入,但是可读性不好,将for命令分为多行,可读性则会好很多。

在表4-3中,内置变量IFS,即字段分隔符(Internal Field Seperator),默认为空白符。上面关于for循环的例子中,变量列表中的元素间的分隔符是空格,实际上分隔符可以通过IFS来定义。下例中定义分隔符为冒号:

978-7-111-48202-4-Chapter06-11.jpg

运行结果如下:

978-7-111-48202-4-Chapter06-12.jpg

Bash的内置变量PATH存放着搜索路径,路径之间是以冒号间隔的。如下脚本先打印搜索路径,再按照先后顺序将每个路径显示出来:

978-7-111-48202-4-Chapter06-13.jpg

运行for_path.sh,得到了预期的结果:

978-7-111-48202-4-Chapter06-14.jpg

978-7-111-48202-4-Chapter06-15.jpg

如果循环变量的取值是连续的,如取1到6,则可以用{1..6}表示。例如,打印1到6:

978-7-111-48202-4-Chapter06-16.jpg

打印a到e:

978-7-111-48202-4-Chapter06-17.jpg

Bash自己可以判断出是升序还是降序。如:

978-7-111-48202-4-Chapter06-18.jpg(www.xing528.com)

顺便说一下,实际上,显示连续的数字或者字母,用echo命令就行。如:

978-7-111-48202-4-Chapter06-19.jpg

在讲述内置特殊变量的时候,提到过$@和$*,见表4-2。不带双引号时,它们是一样的,带双引号时,它们是不一样的。例如,脚本for_at_in_quotes.sh使用了"$@",那么脚本for_at_in_quotes.sh有多个参数时,参数被传入"$@",每个参数是独立的。

978-7-111-48202-4-Chapter06-20.jpg

脚本for_at_in_quotes.sh带上4个参数,即4个人名,循环4次分别对他们说Hello:

978-7-111-48202-4-Chapter06-21.jpg

脚本for_star_in_quotes.sh使用了"$*",那么脚本for_star_in_quotes.sh有多个参数时,参数被传入"$*",所有的参数被作为一个整体。

978-7-111-48202-4-Chapter06-22.jpg

脚本for_star_in_quotes.sh带上4个名字参数,只循环一次,对他们一起说Hello:

978-7-111-48202-4-Chapter06-23.jpg

也就是说,带上同样的4个参数,传入"$@"时,脚本for_at_in_quotes.sh认为有4个循环变量值;传入"$*"时,4个参数被当做一个整体,脚本for_star_in_quotes.sh认为只有一个循环变量值。

$@和$*不带双引号时,它们是一样的。for_at_no_quotes.sh使用不带双引号的$@:

978-7-111-48202-4-Chapter06-24.jpg

传递4个人名参数给for_at_no_quotes.sh:

978-7-111-48202-4-Chapter06-25.jpg

978-7-111-48202-4-Chapter06-26.jpg

for_star_no_quotes.sh使用不带双引号的$*

978-7-111-48202-4-Chapter06-27.jpg

传递4个人名参数给for_star_no_quotes.sh,可见,效果与for_at_no_quotes.sh一致:

978-7-111-48202-4-Chapter06-28.jpg

现在,可以较深刻地理解$@和$*的区别了。${数组名[@]}与${数组名[*]}的区别与$@和$*的区别,是一样的。

文件name_list.txt存放4个人名:

978-7-111-48202-4-Chapter06-29.jpg

创建数组list,记录4个人名:

978-7-111-48202-4-Chapter06-30.jpg

查看一下数组list:

978-7-111-48202-4-Chapter06-31.jpg

然后对数组循环,对数组的每个元素值说hello:

978-7-111-48202-4-Chapter06-32.jpg

如果使用"${数组名[*]}",只循环一次,对所有的元素值一起说hello:

978-7-111-48202-4-Chapter06-33.jpg

for的基本格式当中的“in列表”可以省略。省略以后,“for变量”等同于“for变量in"$@"”。见脚本for_no_list.sh:

978-7-111-48202-4-Chapter06-34.jpg

脚本for_no_list.sh中的forname等同于fornamein"$@",即脚本for_no_list.sh等同于脚本for_at_in_quotes.sh:

978-7-111-48202-4-Chapter06-35.jpg

也就是说,当把脚本参数传给脚本内的for循环时,for循环中的“in列表”可以省略。但是,不省略时脚本的可读性会好一些。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈