當變量給定範圍時,如何在Bash中迭代數字範圍? html
我知道我能夠作到這一點(在Bash 文檔中稱爲「序列表達式」): shell
for i in {1..5}; do echo $i; done
這使: bash
1個
2
3
4
5 spa
可是,如何用變量替換兩個範圍端點? 這不起做用: code
END=5 for i in {1..$END}; do echo $i; done
哪些打印: htm
{1..5} 進程
您可使用內存
for i in $(seq $END); do echo $i; done
for i in $(seq 1 $END); do echo $i; done
編輯:我比其餘方法更喜歡seq
,由於我實際上能夠記住它;) ci
這在bash
能夠正常工做: 文檔
END=5 i=1 ; while [[ $i -le $END ]] ; do echo $i ((i = i + 1)) done
正如Jiaaro所建議的,使用seq
很好。 Pax Diablo建議使用Bash循環來避免調用子進程,另外的好處是,若是$ END太大,則對內存更友好。 Zathrus發現了循環實現中的一個典型錯誤,而且還暗示因爲i
是文本變量,所以在關聯的減慢下執行往返數字的連續轉換。
這是Bash循環的改進版本:
typeset -i i END let END=5 i=1 while ((i<=END)); do echo $i … let i++ done
若是咱們惟一想要的就是echo
,那麼咱們能夠編寫echo $((i++))
。
短暫性教會了我一些東西:Bash容許for ((expr;expr;expr))
構造。 因爲我從未讀過Bash的整個手冊頁(就像我對Korn shell( ksh
)手冊頁所作的那樣,而且好久之前),因此我錯過了。
因此,
typeset -i i END # Let's be explicit for ((i=1;i<=END;++i)); do echo $i; done
彷佛是最有效的內存使用方式(沒必要分配內存來消耗seq
的輸出,若是END很大,可能會出現問題),儘管可能不是「最快」的。
eschercycle指出,{ a .. b } Bash表示法僅適用於文字。 符合Bash手冊。 可使用一個(內部) fork()
而無需exec()
來克服這一障礙(就像調用seq
的狀況同樣,這是另外一個映像,須要fork + exec):
for i in $(eval echo "{1..$END}"); do
eval
和echo
都是Bash內置eval
,可是命令替換( $(…)
構造)須要fork()
)。
seq
方法是最簡單的,可是Bash具備內置的算術評估。
END=5 for ((i=1;i<=END;i++)); do echo $i done # ==> outputs 1 2 3 4 5 on separate lines
for ((expr1;expr2;expr3));
構造的工做方式與C和相似語言中的for (expr1;expr2;expr3)
同樣,而且與其餘((expr))
狀況同樣,Bash將其視爲算術運算。