我有一个Bash脚本:
#!/bin/bash
convert "$1" -resize 50% "$2"
在运行脚本时,我希望只提供源文件(或输入文件名),而输出文件名应该从源文件名自动生成。类似于这样的代码"$1" | cut -d'.' -f1".jpg"
。如果输入文件名是myimage.png
,则输出名称应为myimage.jpg
。应将.jpg
附加到源文件名的第一部分。如果参数是*.png
,它也应该起作用。那么我该如何修改我的脚本?
我有一个Bash脚本:
#!/bin/bash
convert "$1" -resize 50% "$2"
在运行脚本时,我希望只提供源文件(或输入文件名),而输出文件名应该从源文件名自动生成。类似于这样的代码"$1" | cut -d'.' -f1".jpg"
。如果输入文件名是myimage.png
,则输出名称应为myimage.jpg
。应将.jpg
附加到源文件名的第一部分。如果参数是*.png
,它也应该起作用。那么我该如何修改我的脚本?
${X%pattern}
的扩展会删除 $X 结尾的 pattern
。
convert "$1" -resize 50% "${1%.*}.jpg"
要在多个文件上工作:
for filename ; do
convert "$filename" -resize 50% "${filename%.*}.jpg"
done
这将遍历每个命令行参数,并是 for filename in "$@"
的简写。您无需担心检查参数是否为 *.png
- shell 将为您展开它 - 您只需接收扩展的文件名列表。
convert "$1" -resize 50% "${1%.*}.jpg"
%.*
部分,它会删除最后一个点之后的所有内容。如果您的文件没有扩展名,它仍然可以工作(只要路径中没有其他点)。OUTFILE=`echo $1|sed 's/\(.*\)\..*/\1/'`.jpg
convert "$1" -resize 50% "$OUTFILE"
$()
而不是反引号。 - SiegeX
convert "*.png" -resize 50% "*.jpg"
?我怀疑在这种情况下你需要一个循环。 - glenn jackman