修改循环变量bash

时间:2017-03-18 00:22:17

标签: bash loops for-loop

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

请考虑以下代码:

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

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

2 个答案:

答案 0 :(得分:1)

因为它不是C风格的循环。退出循环的条件无论如何与i的值无关。它只会在1到100的范围内循环,并且就此而言。

如果必须:

,可以在bash中使用C风格的for循环
for ((i=1; x<=100; i++)); do
    ((i--))
done

答案 1 :(得分:1)

shell中的for in循环不是数字,而是适用于在in之后从下一个标记/构造生成并存储在内存中的字符串列表。指示的[control]变量在每次迭代中一个接一个地获取列表中的值;没有办法操纵该列表。你可以在循环中修改变量,好吧,但是在下一次迭代中,它将获得列表的下一个值。

换句话说,控件变量不是 control 变量,它只是一个占位符来引用当前列表中的项目(更好:它不是&#34;参考&#34;,它包含所引用项目的副本。)

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

其他语言有类似的结构,如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,使用free(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非常好用,但要注意列表的长度。