bash循环:旧bash版本中的for循环

bash循环:旧bash版本中的for循环,bash,Bash,我有一个较旧版本的bash:3.2.25 我正在尝试编写一个for循环: #!/bin/bash filename="K" for k in {2..20..2} do filename=$filename$k done 这应该给我: K2 K4 . . K20 但这就是它给我的: K{2..20..2} K{2..20..2} . . K{2..20..2} 是因为它是bash的旧版本吗?我怎样才能让它工作?列出所有值不是一个解决方案,因为我必须使用{5..201}。您可以将for

我有一个较旧版本的bash:3.2.25 我正在尝试编写一个for循环:

#!/bin/bash
filename="K"

for k in {2..20..2}
do
  filename=$filename$k
done
这应该给我:

K2
K4
.
.
K20
但这就是它给我的:

K{2..20..2}
K{2..20..2}
.
.
K{2..20..2}

是因为它是bash的旧版本吗?我怎样才能让它工作?列出所有值不是一个解决方案,因为我必须使用{5..201}。

您可以将for循环更改为以下语法:

#!/bin/bash
filename="K"
for ((k=2;k<=20;k+=2))
do
    echo "$filename$k"
done
#/bin/bash
filename=“K”

对于((k=2;k您可以使用
seq
程序:

for k in $(seq 2 2 20); do
  filename=$filename$k
done

我相信这是在Bash4中添加的

你可以做:

for (( k=5; k<=201; k+=2 )); do
    filename=$filename$k
done
((k=5;k)的

测试:

K2
K4
K6
K8
K10
K12
K14
K16
K18
K20

我不是bash专家,但有没有理由更喜欢seq而不是内置for循环?它仍然是内置for循环;只是使用了
seq
而不是序列扩展。当然,使用
seq
的原因是,直到bash 4才添加序列扩展(并与其他伯恩式外壳兼容)。除向后可比性外,实际上使用内置循环可能更好,因为它不会生成外部进程。s/sequence expansion/brace expansion/。brace expansion是在第3版中添加的;但是,直到第4步才添加指定步长的第3个参数。@chepner:我没有任何旧版本的bash来验证我的错误t、 但我相当确定文本大括号扩展(例如,
/{s,}bin
)早在大括号扩展产生数字序列之前就出现了。值得注意的是,对于非常大的数字,这比序列扩展或
seq
更好,因为在使用它们之前,它不必收集并保存内存中的所有数字。对于记录,循环的Bash算法是在版本中添加的n 2.04。
K2
K4
K6
K8
K10
K12
K14
K16
K18
K20