我想定义一个通过shell脚本调用gs
(ghostscript)的简单缩写。第一个参数给出了应该合并的所有文件,最后一个给出了输出文件的名称。显然,以下代码不起作用(它只是为了显示目标):
#!/bin/sh
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$last $1 $2 ...
如何做到这一点?
通常会通过myscript infile1.pdf infile2.pdf ... outfile.pdf
或myscript *.pdf outfile.pdf
调用此脚本。
发布于 2012-04-25 07:17:42
bash变量$@
和$*
展开为命令行参数列表。通常,您会希望使用"$@"
(即用双引号括起来的$@
)。如果有人向您的脚本传递一个包含空格的参数,这将做正确的事情。
因此,如果您的脚本中包含以下内容:
outputfile=$1
shift
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$outputfile "$@"
你的脚本是这样命名的:
myscript out.pdf foo.ps bar.ps "another file.ps"
这将扩展到:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=out.pdf foo.ps bar.ps "another file.ps"
有关更多信息,请阅读bash
手册页的"Special Parameters"部分。
发布于 2012-04-25 09:51:35
要将输出文件作为最后一个参数传递,请使用数组:
ARGS=("$@")
# Get the last argument
outputfile=${ARGS[-1]}
# Drop it from the array
unset ARGS[${#ARGS[@]}-1]
exec gs ... -sOUTPUTFILE=$outputfile "${ARGS[@]}"
在版本4之前,bash
不允许在数组中使用负下标(并且生成了Marius在注释中报告的错误),所以如果您使用的是3.x,则需要使用更丑陋的
outputfile=${ARGS[${#ARGS[@]}-1]}
这也适用于bash 4.x。
发布于 2016-05-22 01:37:40
要访问最后一个参数,除了上面Idelic的答案之外,您还可以执行以下操作:
echo "${@: $#}"
这将读取所有参数,并从最后一个参数开始打印。这样,您还可以访问最后N个参数,例如最后三个参数:
echo "${@: $#-2}"
$ ./script "what does" "this script" "do" "?"
this script do ?
https://stackoverflow.com/questions/10307280
复制相似问题