java遍历变量_如何遍历Bash中变量定义的数字范围?

当变量给定范围时,如何在Bash中迭代数字范围?

我知道我可以做到这一点(在Bash 文档中称为“序列表达式”): for i in {1..5}; do echo $i; done

这使:

但是,如何用变量替换两个范围端点? 这不起作用: END=5

for i in {1..$END}; do echo $i; done

哪些打印:

#1楼

您可以使用 for i in $(seq $END); do echo $i; done

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

编辑:我比其他方法更喜欢seq ,因为我实际上可以记住它;)

#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

eval和echo都是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将其视为算术运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值