簡體   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