首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何定义一个带有可变数量参数的shell脚本?

如何定义一个带有可变数量参数的shell脚本?
EN

Stack Overflow用户
提问于 2012-04-25 07:12:15
回答 3查看 47.9K关注 0票数 40

我想定义一个通过shell脚本调用gs (ghostscript)的简单缩写。第一个参数给出了应该合并的所有文件,最后一个给出了输出文件的名称。显然,以下代码不起作用(它只是为了显示目标):

代码语言:javascript
复制
#!/bin/sh
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$last $1 $2 ...

如何做到这一点?

通常会通过myscript infile1.pdf infile2.pdf ... outfile.pdfmyscript *.pdf outfile.pdf调用此脚本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-25 07:17:42

bash变量$@$*展开为命令行参数列表。通常,您会希望使用"$@" (即用双引号括起来的$@ )。如果有人向您的脚本传递一个包含空格的参数,这将做正确的事情。

因此,如果您的脚本中包含以下内容:

代码语言:javascript
复制
outputfile=$1
shift
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$outputfile "$@"

你的脚本是这样命名的:

代码语言:javascript
复制
myscript out.pdf foo.ps bar.ps "another file.ps"

这将扩展到:

代码语言:javascript
复制
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=out.pdf foo.ps bar.ps "another file.ps"

有关更多信息,请阅读bash手册页的"Special Parameters"部分。

票数 65
EN

Stack Overflow用户

发布于 2012-04-25 09:51:35

要将输出文件作为最后一个参数传递,请使用数组:

代码语言:javascript
复制
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,则需要使用更丑陋的

代码语言:javascript
复制
outputfile=${ARGS[${#ARGS[@]}-1]}

这也适用于bash 4.x。

票数 21
EN

Stack Overflow用户

发布于 2016-05-22 01:37:40

要访问最后一个参数,除了上面Idelic的答案之外,您还可以执行以下操作:

代码语言:javascript
复制
echo "${@: $#}"

这将读取所有参数,并从最后一个参数开始打印。这样,您还可以访问最后N个参数,例如最后三个参数:

代码语言:javascript
复制
echo "${@: $#-2}"

$ ./script "what    does" "this  script" "do" "?"
this  script do ?
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10307280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档