我是Unix编程的新手,我无法弄清楚这段代码有什么问题:
#!/bin/sh
i=1
max=10
for i in {1..$max}
do
echo $i;
done
如果我按照以下方式尝试上述代码,则可以:
#!/bin/sh
i=1
max=10
for i in {1..10}
do
echo $i;
done
我试过这个:
#!/bin/sh
i=1
max=10
for i in {1..`echo $max`}
do
echo $i;
done
和
#!/bin/sh
i=1
max=10
for i in {1..`expr $max`}
do
echo $i;
done
和
#!/bin/sh
i=1
max=10
for i in {1..`echo $max | bc`}
do
echo $i;
done
但它也不起作用..谁能告诉我它怎么会起作用??
答案 0 :(得分:3)
Bash / zsh支持更快更灵活的形式:
for ((i=1; i<$max; ++i));
不要使用外部命令(如seq)或反引号 - 它会减慢你的脚本速度。
答案 1 :(得分:2)
也许你可以试试这个
#!/bin/sh
max=10
for i in $(seq 1 $max)
do
echo "$i"
done
您可以看到此answer
大括号扩展,{x..y}在其他扩展之前执行,因此你不能将它用于可变长度序列。
更新
如果您需要一系列自定义增量,seq
的手册页会给出以下内容:
seq [-w] [-f format] [-s string] [-t string] [first [incr]] last
因此,您可以使用seq 1 3 $max
来获取增量为3的序列。
一般来说,
#!/bin/sh
max=10
incr=3
for i in $(seq 1 $incr $max)
do
echo "$i"
done
答案 2 :(得分:1)
仅{x..y}
和x
为字面数字或单个字符时,才会生成y
形式的序列表达式。它发生在变量扩展之前。如果限制可以包含变量,请使用seq
命令:
for i in $(seq 1 $max)
答案 3 :(得分:1)
bash手册页说:
在任何其他扩展之前执行大括号扩展,并且在结果中保留对其他扩展特殊的任何字符。这是严格的tex- 图阿尔。 Bash不对扩展的上下文或大括号之间的文本应用任何语法解释。
所以看起来bash只是逐字逐句地传递大括号中的文字。我不熟悉那种语法,我不得不查阅它。它听起来并不像是用于for循环。
bash有更新的方法,但传统方式是
for i in $(seq 1 $max)
do
# whatever...
done
由于任何事情都可以通过足够的努力在bash中完成,而且我无法拒绝挑战,所以无论如何你都可以用括号做到这一点:
for i in $(eval echo {1..$max})
do
echo $i
done