0

我希望使用一个 shell 脚本来接受 imagemagick 脚本的目录的 for 循环。shell脚本是这样的:

#!/bin/sh
# ~/scripts/mkhdr.sh
                                                                                                                                         
convert -gaussian $1 $2 - | composite -compose overlay $2 - $3

因此for循环是:

for i in *.(tif|jpg);do;echo converting $i;~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg;done

在没有空格的文件目录上工作正常。在文件名包含空格的目录上失败。

更新:

感谢Adrian Frühwirth,以下是有效的方法:

#!/bin/sh
# ~/scripts/mkhdr.sh
                                                                                                                                         
convert -gaussian "$1" "$2" - | composite -compose overlay "$2" - "$3"

命令行:

for file in *.(tif|jpg);do;echo converting "${file}";~/scripts/mkhdr.sh 3 "${file}" "/Users/me/Desktop/${file}";done
4

2 回答 2

2

您发布的两个片段都有一些问题。让我们从第二个开始:

for i in *.(tif|jpg); do
    echo converting $i
    ~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg
done
  1. 正如已经指出的,您需要引用变量以说明文件名中的空格。
  2. 我不熟悉zsh's 的:r语法,但是由于您正在搜索.jpgAND.tif文件:r.jpg,因此不会考虑这些.tif文件。

现在第一个片段:

#!/bin/sh
# ~/scripts/mkhdr.sh

convert -gaussian $1 $2 - | composite -compose overlay $2 - $3

即使您在另一个代码段中引用了变量,它们在这里也没有被引用,并且再一次,带有空格的文件名将是一个问题。

现在让我们应用一些修复,从对话片段开始:

#!/bin/sh
# ~/scripts/mkhdr.sh

convert -gaussian "$1" "$2" - | composite -compose overlay "$2" - "$3"
  • 始终引用您的变量以确保安全。

和调用片段:

for file in *.tif *.jpg; do
        echo "converting '${file}'"
        ~/scripts/mkhdr.sh 3 "${file}" "./SSP_JPGs/${file%.*}"
done
  • 引用变量。
  • *.(tif|jpg)将语法更改为*. tif *.jpg. 这应该适用于所有zsh,bashksh93,但您不必使用它。
  • 改为。$i:r.jpg_ 这从 的 值后面${i%.*}删除了短匹配,这恰好是文件扩展名。这应该适用于所有,和..*izshbashksh93
于 2013-04-06T10:42:29.127 回答
1

您可以使用read; 然后引用所有出现的$i

ls *.tif *.jpg | while read i; do
  echo converting "$i";
  ~/scripts/mkhdr.sh 3 "./$i" "./SSP_JPGs/$i:r.jpg";
done

我不确定该$i:r.jpg部分,它将:r.jpg附加到文件名?

于 2013-04-05T19:49:07.090 回答