带args的Shell脚本,其中args是带空格的文件
我希望使用一个shell脚本,它接受imagemagick脚本目录的for循环。shell脚本如下所示:带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 - |
#!/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,脚本将在该行结束。否则,这个钉子就可以了,谢谢!