我正在尝试用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
答案 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]}
形式,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扩展,而不是由命令替换($(..)
)解释。
答案 2 :(得分:-1)
循环显示当前目录中的所有文件很简单:
tail -f my_log.txt
您正在使用的for i in $( ls -1 )
do
# your code here, variable is referenced with $i
done
变量是什么?