您好我是bash编程的新手,需要一些帮助。我正在构建一个用于图像处理的管道。我希望能够将png图像放在一个文件夹中并将它们传递给clusterImage.pl一旦完成我想将输出的文件传递给seperateObjects.pl,输出的文件具有相同的名称但具有kmeansOutput。 all.matrix附在最后。以下是我到目前为止所做的,但它不起作用。 任何帮助将不胜感激。谢谢
#!/bin/bash
#This script will take in an image and a matrix file.
#The output will be an image and a matrix file.
list=`ls *.png`
for i in $list
do
$file="./$list"
$image_array = $list
echo $file
#Cheching to see if the file exists.
for((j=0;j<=i;j++))
do
if [ -e image_array[j] ]; then
echo $file
echo "Begining processing"
#Take in an image and create a matrix from it.
perl clusterImage.pl SampleImage.png
#Take in a matrix and draw a picture showing the centers of all
#of the colonies.
perl seperateObjects.pl SampleImage.png.kmeansOutput.all.matrix
echo "Ending processing"
else
echo "There is an issue"
fi
done
done
答案 0 :(得分:7)
这应该有效:
for file in *.png; do
# do stuff with your file:
perl clusterImage.pl "$file";
# …
done
答案 1 :(得分:4)
我发现您的代码存在一些问题(或潜在的改进):
for i in $list
,因为你从不在脚本中使用$i
- 导致一遍又一遍地做同样的事情(与数量相同的次数)目录中的.png
个文件)*.png
等列表中的不同文件名。perl clusterImage.pl
文件上运行.png
...或者你呢?这很难说。编辑您的问题以更清楚地解释您的意思,我可以相应地编辑我的答案。您可以使用短路来代替if
语句,而不是[ -f file.png ] && echo "file exists"
语句:if [ -f file.png ]; then
echo "file exists"
fi
短于
perl clusterImage.pl <name_of_image.png>
如果我理解你要做的事情(而且我不确定),我认为这对你有用。对于目录中的每个图像,这将运行perl separateObjects.pl <name_of_image.png>.kmeansOutput.all.matrix
和for image in *.png
do
[[ -f $image ]] && perl clusterImage.pl $image && perl separateObjects.pl $image.kmeansOutput.all.matrix
done
。
{{1}}
答案 2 :(得分:1)
如果你真的想要一个数组,可以:Advanced Bash-Scripting Guide: Arrays
但也许更好(或至少更简单)修改Perl脚本来处理文件列表,或者单独处理每个图像。
答案 3 :(得分:1)
您通常不希望在作业的左侧有变量名称上的美元符号。
你可以创建一个这样的数组:image_array=($(ls *.png))
但如果文件名中包含空格则会失败。
Don't parse ls
至少是出于这个原因。
Don't use backticks,请改用$()
。
您已经嵌套了似乎彼此冲突的循环。 knittl's answer中的结构是您应该使用的结构。