【发布时间】: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/bashshebang。同样,let可以替换为i=$(( i * 2 ))(同时符合 POSIX)或扩展语法(( i=i*2 ))。 -
另外,
start = 16和max = 256都是错误的——它们运行start和max作为命令(=作为第一个参数,数字作为第二),不执行任务。去掉空格:start=16和max=256。顺便说一句,这是shellcheck.net 会为你捕捉到的东西。 -
你不会做shell编程,讨厌
while。学会爱它。