[英]How to define a shell script with variable number of arguments?
我想定义一个通过 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
调用此脚本。
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
手册页的“特殊参数”部分以获取更多信息。
要将输出文件作为最后一个参数传递,请使用数组:
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。
要访问最后一个参数,除了上面的 Idelic 的答案,您还可以执行以下操作:
echo "${@: $#}"
这将读取所有参数并从最后一个开始打印它们。 这样,您还可以访问 N 个最后一个参数,例如最后三个参数:
echo "${@: $#-2}"
$ ./script "what does" "this script" "do" "?"
this script do ?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.