Bash seq 在 for 循环中产生两个独立的数字序列
Bash seq to produce two separate sequences of numbers in a for loop
我想创建一个简单的 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
# 方法 2
在你的后续评论中,你写
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 () {
# : initial value
# : increment
# : upper bound
# : name of a function that takes one parameter
local i=
while [ $i -le ]; do
$i
i=$((i+))
done
}
f () {
printf "%s\n" ""
}
custom_for_loop 0 5 15 f
custom_for_loop 30 5 45 f
我想创建一个简单的 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
# 方法 2
在你的后续评论中,你写
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 () {
# : initial value
# : increment
# : upper bound
# : name of a function that takes one parameter
local i=
while [ $i -le ]; do
$i
i=$((i+))
done
}
f () {
printf "%s\n" ""
}
custom_for_loop 0 5 15 f
custom_for_loop 30 5 45 f