带有args的shell脚本,其中args是带空格的文件

时间:2013-04-05 18:51:03

标签: shell image-processing imagemagick zsh

我希望使用一个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

2 个答案:

答案 0 :(得分:2)

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

for i in *.(tif|jpg); do
    echo converting $i
    ~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg
done
  1. 正如已经指出的那样,您需要引用变量来说明文件名中的空格。
  2. 我不熟悉zsh的{​​{1}}语法,但由于您要搜索的是:r.jpg个文件.tif,因此无法解释:r.jpg个文件。
  3. 现在是第一个片段:

    .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 *.jpgzshbash,但您不必使用此功能。
    • ksh93更改为$i:r.jpg。这会从${i%.*}的值后面删除.*的短路匹配,这恰好是文件扩展名。这应该适用于所有izshbash

答案 1 :(得分: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 附加到文件名??