【问题标题】:for loop in Bash doubling the step value each timeBash中的for循环每次将步长值加倍
【发布时间】:2016-12-28 17:46:31
【问题描述】:

按照this bash 循环的基本教程,我编写了以下脚本:

#!/bin/bash
# since Bash v4

i=16
max=256

while [  $i -le $max ]; do 
     echo $i
     let i=i*2
done

但既然我觉得这太可怕了(我是一个纯粹的while 仇恨者),有没有办法写出类似这样的东西:

#!/bin/bash
# since Bash v4

start = 16
max = 256

for i in {start..max..i*2}
do
     echo $i
done

【问题讨论】:

  • 请考虑使用比 TLDP 更好的材料——尤其是 ABS,以 bash 的 w3schools 着称,充满了不良实践示例和过时的内容。 Wooledge BashGuide 就是这样一个更好的参考; tag wiki中还有其他人。
  • 顺便说一句,{start..max..i*2}BashPitfalls #33 发生冲突。
  • 顺便说一句,您的while 循环条件可以更易读地表示为while (( i <= max )); do,因为您的脚本使用#!/bin/bash shebang。同样,let 可以替换为 i=$(( i * 2 ))(同时符合 POSIX)或扩展语法 (( i=i*2 ))
  • 另外,start = 16max = 256 都是错误的——它们运行 startmax 作为命令(= 作为第一个参数,数字作为第二),不执行任务。去掉空格:start=16max=256。顺便说一句,这是shellcheck.net 会为你捕捉到的东西。
  • 你不会做shell编程,讨厌while。学会它。

标签: bash loops for-loop


【解决方案1】:

您可以使用for 循环:

for ((i = 16; i <= 256; i = i * 2)); do
  echo "$i"
done

给出这个输出:

16
32
64
128
256

【讨论】:

  • 除了引用$i 的扩展作为例行事务(以及处理像IFS 中的数字这样的古怪极端情况),这正是我会写的。
  • @CharlesDuffy:从你身上学到了很多东西!我刚刚做了你建议的改变。
  • FWIW,我会写i *= 2。 (或者i += i,但这确实是个坏习惯。)
猜你喜欢
  • 2011-04-27
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多