我有一个脚本需要用$1
和$2
做一些事情,然后它需要执行发送给它的其余参数(如果存在的话)。目前,我正在尝试这样做:
if [ ! -z "$3" ]; then
${@:3}
eval $@
fi
但这并不适用。我怎样才能达到预期的行为?
进一步澄清:$ 1是一个文件,$ 2是另一个脚本,$ @应该是另一个脚本,后面跟着最终脚本的任何参数。
答案 0 :(得分:2)
在处理前2个参数后,您可以使用shift
删除$1
和$2
:
# discard first 2 arguments
shift 2
# now handle remaining aguments if they exist
(($#)) && "$@"
答案 1 :(得分:2)
测试$3
是否具有非零长度与测试它是否存在完全不同。要测试位置参数的数量,请使用$#
。例如,
if test $# -gt 2; then
# ...
fi
如何做某事"其余参数在很大程度上取决于您实际想要做什么,但为了避免这些参数受到(附加)单词拆分,您可能希望在双引号内扩展$@
。例如,
# shift off the first two positional parameters
shift 2
# execute the remaining parameters as a command, with each parameter as
# one word
"$@"
正如@chepner在他的评论中所指出的那样,如果您希望使用此扩展而不是从第三个开始获取位置参数,则可以跳过shift
:
"${@:3}"
如果你知道它总是完全是你想要跳过的前两个参数,那就更清晰,更简洁了,但shift
在某些方面可能非常方便案例,例如用于咀嚼可能包含可选组件的参数列表,以避免在参数列表中跟踪或使用变量索引。