for循环的基本语法格式为:
或者为(在一行之内写for循环时注意,关键字do和done前面的分号不能省略):
for循环的流程如图6-1所示。
图6-1 for循环流程图
下面的例子是对4个人依次问候早安,循环4次。变量name的值在4次循环当中依次是Tom、Jack、Harry和Merry。
运行该脚本,得到输出如下:
for循环的变量列表还可以来自文件:
脚本for_cat.sh中,使用了命令替换功能,将catname_list.txt的输出作为for循环的变量列表:
执行脚本for_cat.sh,效果与脚本for_loop.sh相同:
for循环也可以在命令行直接输入执行,不是必须放在一个脚本里面。下例打印出1到5:
>为系统给出的续行提示符。若for循环可以在一行之内输入,就“不用麻烦”系统给出续行提示符了,如:
当for命令很长时,虽然仍旧可以在一行之内输入,但是可读性不好,将for命令分为多行,可读性则会好很多。
在表4-3中,内置变量IFS,即字段分隔符(Internal Field Seperator),默认为空白符。上面关于for循环的例子中,变量列表中的元素间的分隔符是空格,实际上分隔符可以通过IFS来定义。下例中定义分隔符为冒号:
运行结果如下:
Bash的内置变量PATH存放着搜索路径,路径之间是以冒号间隔的。如下脚本先打印搜索路径,再按照先后顺序将每个路径显示出来:
运行for_path.sh,得到了预期的结果:
如果循环变量的取值是连续的,如取1到6,则可以用{1..6}表示。例如,打印1到6:
打印a到e:
Bash自己可以判断出是升序还是降序。如:
(www.xing528.com)
顺便说一下,实际上,显示连续的数字或者字母,用echo命令就行。如:
在讲述内置特殊变量的时候,提到过$@和$*,见表4-2。不带双引号时,它们是一样的,带双引号时,它们是不一样的。例如,脚本for_at_in_quotes.sh使用了"$@",那么脚本for_at_in_quotes.sh有多个参数时,参数被传入"$@",每个参数是独立的。
脚本for_at_in_quotes.sh带上4个参数,即4个人名,循环4次分别对他们说Hello:
脚本for_star_in_quotes.sh使用了"$*",那么脚本for_star_in_quotes.sh有多个参数时,参数被传入"$*",所有的参数被作为一个整体。
脚本for_star_in_quotes.sh带上4个名字参数,只循环一次,对他们一起说Hello:
也就是说,带上同样的4个参数,传入"$@"时,脚本for_at_in_quotes.sh认为有4个循环变量值;传入"$*"时,4个参数被当做一个整体,脚本for_star_in_quotes.sh认为只有一个循环变量值。
$@和$*不带双引号时,它们是一样的。for_at_no_quotes.sh使用不带双引号的$@:
传递4个人名参数给for_at_no_quotes.sh:
for_star_no_quotes.sh使用不带双引号的$*:
传递4个人名参数给for_star_no_quotes.sh,可见,效果与for_at_no_quotes.sh一致:
现在,可以较深刻地理解$@和$*的区别了。${数组名[@]}与${数组名[*]}的区别与$@和$*的区别,是一样的。
文件name_list.txt存放4个人名:
创建数组list,记录4个人名:
查看一下数组list:
然后对数组循环,对数组的每个元素值说hello:
如果使用"${数组名[*]}",只循环一次,对所有的元素值一起说hello:
for的基本格式当中的“in列表”可以省略。省略以后,“for变量”等同于“for变量in"$@"”。见脚本for_no_list.sh:
脚本for_no_list.sh中的forname等同于fornamein"$@",即脚本for_no_list.sh等同于脚本for_at_in_quotes.sh:
也就是说,当把脚本参数传给脚本内的for循环时,for循环中的“in列表”可以省略。但是,不省略时脚本的可读性会好一些。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。