繁体   English   中英

修改循环变量bash

[英]Modify loop variable bash

我希望能够从循环内部修改for-in循环中使用的变量的值。

考虑以下代码:

#!/bin/bash
for i in {1..100} 
do 
    ((i--))
done;

为什么这个循环不是无限循环? 怎么会这样

因为它不是C风格的循环。 退出循环的条件与i的值无关。 它只会在1到100的范围内循环,仅此而已。

如果需要,可以在bash中使用C样式的for循环:

for ((i=1; x<=100; i++)); do
    ((i--))
done

Shell中的for in循环不是数字的,而是作用于in之后的下一个标记/构造所生成并存储在内存中的字符串列表。 指示的[control]变量从列表中获取值,每次迭代都一个接一个地进行; 无法操纵该列表。 您可以在循环内修改变量,确定,但是在下一次迭代时,它将获得列表的下一个值。

换句话说,控制变量不是 控制变量,它只是引用列表中当前项目的占位符(更好:它不是“ refer”,它包含所引用项目的副本 )。

这意味着在创建字符串列表时,迭代次数将预先确定一次。 迭代次数等于列表中的字符串数(当然,您可以在循环内中断 )。

其他语言也有类似的构造,例如for each ...或使用迭代器等。

可以通过以下示例解释有关for的真实情况:

for a in *
do echo $a
done

真的被解释为

for a in file1 file2 file3 file4 ie all the files in current directory
....

实际上是完全合法的

for a in 1 2 3 4 A B C D
...

最后一点。 我说过for的列表保存在内存中。 我打开两个端子,展开了for在一个,在检查中使用的其它的存储器消耗自由(1)。

for a in 1 2 3; do sleep 50; done
...gives...
             total       used       free     shared    buffers     cached
Mem:        246596     224712      21884          0      33948      71584


for a in $(seq 1 1000000); do sleep 50; done
...gives...
             total       used       free     shared    buffers     cached
Mem:        246596     242864       3732          0       8400      24668

(请注意,缓冲区从33948下降到8400,缓存从71584下降到24668)。 最后再要求十倍:

for a in $(seq 1 10000000); do sleep 50; done
...gives...
             total       used       free     shared    buffers     cached
Mem:        246596     243492       3104          0        688       8700

(更多的缓冲区下降)。 内核试图寻找更多的内存,并且这样做会降低可怜的小型计算机的速度!

这个shell for很漂亮,功能强大,但列表的长度要小心了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM