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

带args的Shell脚本,其中args是带空格的文件,shell,image-processing,imagemagick,zsh,Shell,Image Processing,Imagemagick,Zsh,我希望使用一个shell脚本,它接受imagemagick脚本目录的for循环。shell脚本如下所示: #!/bin/sh # ~/scripts/mkhdr.sh convert -gaussian $1 $2 - |

我希望使用一个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
在没有空格的文件目录下运行良好。在文件名包含空格的目录上失败

更新: 多亏了,以下是有效的方法:

#!/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

您可以使用
读取
;然后引用所有出现的
$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附加到文件名???

您可以使用
读取
;然后引用所有出现的
$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

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

for i in *.(tif|jpg); do
    echo converting $i
    ~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg
done
  • 正如已经指出的,您需要引用变量来说明文件名中的空格
  • 我不熟悉
    zsh
    :r
    语法,但由于您正在搜索
    .jpg
    .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
      bash
      ksh93
      ,但您不必使用它
    • $i:r.jpg
      更改为
      ${i%.*}
      。这将从
      i
      值的后面删除
      *
      的短匹配,该值恰好是文件扩展名。这应该适用于所有
      zsh
      bash
      ksh93

      • 您发布的两个代码片段都有几处错误。让我们从第二个开始:

        for i in *.(tif|jpg); do
            echo converting $i
            ~/scripts/mkhdr.sh 3 ./$i ./SSP_JPGs/$i:r.jpg
        done
        
      • 正如已经指出的,您需要引用变量来说明文件名中的空格
      • 我不熟悉
        zsh
        :r
        语法,但由于您正在搜索
        .jpg
        .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
          bash
          ksh93
          ,但您不必使用它
        • $i:r.jpg
          更改为
          ${i%.*}
          。这将从
          i
          值的后面删除
          *
          的短匹配,该值恰好是文件扩展名。这应该适用于所有
          zsh
          bash
          ksh93

        • :r
          语法似乎是zsh从csh借来的;它生成文件名的“根”,即删除任何后缀的名称<代码>文件=foo.txt;echo$file:r
    将打印
    foo
    。只要对
    $I
    的引用是双引号,那么
    for
    循环应该可以工作(我认为);不,不工作。脚本将继续尝试将文件名中的空格解析为唯一文件。你是对的“:r.jpg”做了Keith指出的事情,尽管我在bash下做了很多年。这是因为你的
    mkhdr.sh
    仍然有不带引号的变量(见我的答案)。无论如何,
    :r
    语法似乎是zsh从csh借来的东西;它生成文件名的“根”,即删除任何后缀的名称<代码>文件=foo.txt;echo$file:r
    将打印
    foo
    。只要对
    $I
    的引用是双引号,那么
    for
    循环应该可以工作(我认为);不,不工作。脚本将继续尝试将文件名中的空格解析为唯一文件。你是对的“:r.jpg”做了Keith指出的事情,尽管我在bash下做了很多年。这是因为你的
    mkhdr.sh
    仍然有不带引号的变量(见我的答案)。无论哪种方式,。是/bin/sh还是/bin/zsh,都有非常不同的可用选项集。祝你好运。我更喜欢/bin/zsh/bin/sh是偶然出现的。它是/bin/sh还是/bin/zsh,提供了非常不同的选项集。祝你好运。我更喜欢/bin/zsh/bin/sh是偶然的。Re:“:r.jpg”正是我在本文中想要的,因为我正在使用convert-to转换图形文件。此外,我的*(jpg | tif)构造比您的空格分隔选择器工作得更好。如果目录中没有TIF,脚本将在该行结束。否则,这个钉子就可以了,谢谢!Re:“:r.jpg”正是我在本文中想要的,因为我正在使用convert-to转换图形文件。此外,我的*(jpg | tif)构造比您的空格分隔选择器工作得更好。如果目录中没有TIF,脚本将在该行结束。否则,这个钉子就可以了,谢谢!