Bash在for循环中读取多个文件(作为执行参数)

时间:2016-01-22 11:15:29

标签: bash

我正在尝试用bash forloop读取一个文件。但我不知道如何为此编写脚本。

for i in $( seq 0 $step 10 )
do
    echo "Rendering: "$(( i + j ))
    python auto_fine.py density000000.vtu velocity000000.vtu $(( i + j ))
done

我需要调用的每个循环

i - > 0 python auto_fine.py density000000.vtu velocity000000.vtu

i - > 1 python auto_fine.py density000010.vtu velocity000010.vtu

i - > 2 python auto_fine.py density000020.vtu velocity000020.vtu

3 个答案:

答案 0 :(得分:2)

在我看来,您需要将sed提供给您的数字填零:

How to zero pad a sequence of integers in bash so that all have the same width?所示,您需要执行类似

的操作
$ seq -f "%06g" 0 10 100

返回:

000000
000010
000020
...
000100

一起,

for i in $(seq -f "%06g" 0 10 100)
do
    # echo "Rendering: "$(( i + j )) -- not sure what this does
    python auto_fine.py density$i.vtu velocity$i.vtu
done

答案 1 :(得分:1)

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

此选项通过在递增数字后面以printf格式放置零来显示每10个项目,该数字变为十位数。如果您想要更多的任意排序,您可以使用乘数,但不会产生外部过程:

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]}形式,xy     整数或单个字符,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扩展,而不是由命令替换($(..))解释。

答案 2 :(得分:-1)

循环显示当前目录中的所有文件很简单:

tail -f my_log.txt

您正在使用的for i in $( ls -1 ) do # your code here, variable is referenced with $i done 变量是什么?