Bash可以做到这一点,而不需要像seq
这样的外部工具。
for i in {0..100}; do
[[ $i = *0 ]] || continue
python auto_fine.py density$(printf '%06d' $i).vtu velocity$(printf '%06d' $i).vtu
done
这将使用模式匹配(*0
)到您的列表限制为每10号,这是一个黑客位,但将努力对您的样本数据。
,你可以对直接在零填充数字字符串交替循环:
for i in $(printf '%05d0 ' {0..10}); do
python auto_fine.py density$i.vtu velocity$i.vtu
done
此选项显示每10个项目由增加数量,成为十位数字后加一个零在printf
格式。如果你想要更多的任意排序,您可以使用乘法器,仍然没有产卵外部进程:
low=0
high=100
mult=10
for i in $(eval echo {$low..$((high/mult))}); do
n=$(printf '%06d' $((i*mult)))
python auto_fine.py density$n.vtu velocity$n.vtu
done
注意eval
,它可以让你扩大变量在序列表达式中使用。 (如果您从外部获取这些数字,请在使用它们之前验证它们)
如果您使用bash版本4(即不是OSX上的本机版本),还可以使用增量序列表达式。从手册页:
序列表达式的形式为{x..y[..incr]}
,其中x
和y
是 任一整数或单个字符,incr
,可选的增量, 是整数。
因此,也许:
low=0
high=100
mult=10
for i in $(eval "printf '%06d ' {$low..$high..$mult}"); do
python auto_fine.py density$i.vtu velocity$i.vtu
done
注意,在表达式序列,该序列的第一成员是提供,而不是仅仅一个乘法器的乘积的第一个号码。我们在printf周围引用了引号,以确保序列表达式被eval扩展,并且不被命令替换($(..)
)解释。
好的。但请注意,OP可能需要'seq',因为它允许您指定步骤,甚至更重要的是使用变量。 – fedorqui
@fedorqui - 谢谢。在第一个例子中,我们通过跳过不以0结尾的数字来排序10。第二个例子中,由于printf格式字符串,我们隐含地加10。第三,我们使用乘数在序列表达式上创建* real *增量。 – ghoti
@fedorqui - 当然,我意识到只有在写完这个答案之后,我才在OSX中进行测试。 '{x..y..incr}'符号是用bash 4引入的,并且很好地处理了序列。 – ghoti