我想创建一个简单的 for bash 循环,以特定间隔迭代一系列数字,然后迭代不同的数字序列,例如
for i in $(seq 0 5 15)
do
echo $i
done
但是在遍历 i
=0, 5, 10, 15 之后,我希望它也遍历 30, 35, 40, 45。
有没有办法使用 seq
来做到这一点?或者替代方案?
最佳答案
方法一
只需在 $(...)
中增加对 seq
的命令:
for i in $(seq 0 5 15; seq 30 5 45); do
echo $i
done
然后
$ bash test.sh
0
5
10
15
30
35
40
45
#方法二
在你的后续评论中,你写
The actual content of the for loop is more than just
echo$i
(about 200 lines) I don't want to repeat it and make my script huge!
作为上述方法的替代方法,您可以为这 200 行定义一个 shell 函数,然后在一系列 for
循环中调用该函数:
f() {
# 200 lines
echo $i
}
for i in $(seq 0 5 15) do
f
done
for i in $(seq 30 5 45) do
f
done
方法 3(符合 POSIX)
为了最大程度地跨 shell 移植,您应该使您的脚本符合 POSIX 标准。在这种情况下,您需要避开 seq
,因为尽管许多发行版都提供了该实用程序,但它并未由 POSIX 定义。
由于您不能使用 seq
生成要迭代的整数序列,并且因为 POSIX 没有定义数字 C 风格的 for
循环,所以您必须求助于 while
循环。为避免重复与该循环相关的代码,您可以定义另一个函数(在下面称为 custom_for_loop
):
custom_for_loop () {
# $1: initial value
# $2: increment
# $3: upper bound
# $4: name of a function that takes one parameter
local i=$1
while [ $i -le $3 ]; do
$4 $i
i=$((i+$2))
done
}
f () {
printf "%s\n" "$1"
}
custom_for_loop 0 5 15 f
custom_for_loop 30 5 45 f
关于Bash seq 在for循环中产生两个独立的数字序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482421/