如何遍历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将其视为算术运算。

相关文章
相关标签/搜索