如何遍歷Bash中變量定義的數字範圍?

當變量給定範圍時,如何在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} 進程


#1樓

您可使用內存

for i in $(seq $END); do echo $i; done

#2樓

for i in $(seq 1 $END); do echo $i; done

編輯:我比其餘方法更喜歡seq ,由於我實際上能夠記住它;) ci


#3樓

這在bash能夠正常工做: 文檔

END=5
i=1 ; while [[ $i -le $END ]] ; do
    echo $i
    ((i = i + 1))
done

#4樓

討論區

正如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

evalecho都是Bash內置eval ,可是命令替換( $(…)構造)須要fork() )。


#5樓

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將其視爲算術運算。

相關文章
相關標籤/搜索