如何缩短发送到脚本的参数列表,然后评估缩短列表的其余部分?

时间:2016-10-19 18:24:30

标签: bash

我有一个脚本需要用$1$2做一些事情,然后它需要执行发送给它的其余参数(如果存在的话)。目前,我正在尝试这样做:

  if [ ! -z "$3" ]; then
    ${@:3}
    eval $@
  fi

但这并不适用。我怎样才能达到预期的行为?

进一步澄清:$ 1是一个文件,$ 2是另一个脚本,$ @应该是另一个脚本,后面跟着最终脚本的任何参数。

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在某些方面可能非常方便案例,例如用于咀嚼可能包含可选组件的参数列表,以避免在参数列表中跟踪或使用变量索引。