我想创建一个可以给出3个参数的脚本:task,infile-type,outfile-type;它应该将任务应用于文件夹中的每个这样的文件。例如,我应该能够发出命令:convert png jpg
,它应该将所有png文件转换为文件夹中的jpg。我还应该能够发送包含在引号中的任务选项,例如:"convert -o myoption" png jpg
我试过了:
#! /bin/bash
for f in *.$2
do
$1 "$f" -o "${f%.$2}.$3"
done
以上工作还是需要在{}或[]附上$ 1等?我没有尝试过,因为如果错误,可能会对文件造成不可预测的损坏。谢谢你的帮助。
答案 0 :(得分:3)
您可以使用 GNU Parallel 轻松表达这一点,并且还可以并行运行所有任务:
parallel convert {} {.}.png ::: *.jpg
其中{}
替换参数,{.}
表示没有扩展名的参数。
关于你做某些有潜在危险的事情的关注,使用--dry-run
来测试它会做什么,而不实际做任何事情:
parallel --dry-run convert -o XYZ {} {.}.png ::: *.jpg
示例输出
convert -o XYZ a.jpg a.png
convert -o XYZ a\ g.jpg a\ g.png
convert -o XYZ b.jpg b.png
答案 1 :(得分:1)
我想你想要在你的文件夹中有一个文件列表。你可以尝试一下。现在让我,如果有一些错误,我可以将它改为你想要的
#! /bin/bash
# Command which should performed
echo $1
# File type IN
echo $2
# File type OUT
echo $3
for i in $(ls)
do
$1 $2 $3 $i
done
答案 2 :(得分:1)
编写可能带来危险结果的shell脚本时的一种有用技巧
只需使用echo
内置。
您的代码基本上是正确的,我只是使用一些额外的引用 以及排除对不存在的文件采取行动的可能性的测试(即使这更加美观......)
repeat() { for f in *.$2 ; do
[ -f "$f" ] && echo $1 \"$f\" \"${f%.$2}.$3\"
done ; }
这是一个简短的终端会议,展示它是如何运作的
$ ls
a b.png a.png b.png
$ repeat() { for f in *.$2 ; do [ -f "$f" ] && echo $1 \"$f\" \"${f%.$2}.$3\" ; done ; }
$ repeat 'cp -f' pmg jpg #### typinh error
$ repeat 'cp -f' png jpg
cp -f "a b.png" "a b.jpg"
cp -f "a.png" "a.jpg"
cp -f "b.png" "b.jpg"
$ repeat 'cp -f' png jpg | sh
$ ls
a b.jpg a b.png a.jpg a.png b.jpg b.png
$
如果您对自己的代码有99.9%的确定,请删除echo
并在那里......
答案 3 :(得分:1)
将命令移动到参数列表的末尾。
#! /bin/bash
src=$1; shift
dst=$1; shift
for f in *."$src"
do
"$@" "$f" -s -o "${f%.$src}.$dst"
done
然后正确引用参数
my-script png jpg convert -o myoption
甚至,如果参数包含空格。
my-script png jpg convert --some-option "argument with spacees"