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

Bash 如何缩短发送到脚本的参数列表,然后计算缩短列表的其余部分?,bash,Bash,我有一个脚本,需要对$1和$2执行一些操作,然后需要执行发送给它的其余参数(如果存在)。目前,我正在尝试这样做: if [ ! -z "$3" ]; then ${@:3} eval $@ fi 但这似乎不起作用。我怎样才能达到期望的行为 为了进一步澄清:$1是一个文件,$2是另一个脚本,$@应该是另一个脚本,后跟该最终脚本的任何参数。在处理前两个参数后,您可以使用shift删除$1和$2: # discard first 2 arguments shift 2 #

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

  if [ ! -z "$3" ]; then
    ${@:3}
    eval $@
  fi
但这似乎不起作用。我怎样才能达到期望的行为


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

在处理前两个参数后,您可以使用
shift
删除
$1
$2

# discard first 2 arguments
shift 2

# now handle remaining aguments if they exist
(($#)) && "$@"

在处理前2个参数后,可以使用
shift
删除
$1
$2

# discard first 2 arguments
shift 2

# now handle remaining aguments if they exist
(($#)) && "$@"

测试
$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
"$@"
如何使用剩下的参数“做点什么”在很大程度上取决于您实际想要做什么,但是为了避免这些参数受到(额外的)分词的影响,您需要在双引号内展开
$@
。比如说,

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在他的评论中所观察到的,如果您希望使用此展开来获取从第三个开始的位置参数,您可以跳过
移位

"${@:3}"

如果您知道要跳过的总是前两个参数,那么这会更清楚、更简洁,但是在某些情况下,
shift
可能非常方便,例如仔细查看可能包含可选组件的参数列表,避免在参数列表中跟踪或使用变量索引。

测试
$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
"$@"
如何使用剩下的参数“做点什么”在很大程度上取决于您实际想要做什么,但是为了避免这些参数受到(额外的)分词的影响,您需要在双引号内展开
$@
。比如说,

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在他的评论中所观察到的,如果您希望使用此展开来获取从第三个开始的位置参数,您可以跳过
移位

"${@:3}"

如果您知道要跳过的总是前两个参数,那么这会更清楚、更简洁,但是在某些情况下,
shift
可能非常方便,例如仔细查看可能包含可选组件的参数列表,避免在参数列表中跟踪或使用变量索引。

参数代表什么?它们是命令名,还是这些命令的命令名和参数的组合。使用
eval
几乎肯定是错误的选择;你能提供一个具体的例子来说明你的脚本是如何被调用的,以及它应该如何处理参数吗?在
eval
@chepner之前使用
shift 2
,这是对OP的一点澄清。尝试一下当前建议的shift方法/你正在寻找的
shift
。为了方便起见,Bash允许对多个参数进行移位
shift 2
,但IIRC这是不可移植的。参数代表什么?它们是命令名,还是这些命令的命令名和参数的组合。使用
eval
几乎肯定是错误的选择;你能提供一个具体的例子来说明你的脚本是如何被调用的,以及它应该如何处理参数吗?在
eval
@chepner之前使用
shift 2
,这是对OP的一点澄清。尝试一下当前建议的shift方法/你正在寻找的
shift
。为了方便起见,Bash允许
shift 2
移动多个参数,但IIRC这是不可移植的。即使
shift
也不是严格必需的
“${@:3}”
将跳过前两个参数,如果没有实际设置参数3和on,则不会执行任何操作;我已经在我的回答中添加了这一点,以及一些关于使用该表单与使用
shift
的注释。所以${@:3}应该执行参数3和on(如果存在)?为什么我当时在OP中发布的部分没有出现这种情况?@FutureShock,我建议将其扩展为双引号,如我的回答所示,但是是的,您的原始代码应该可以工作。这对我来说确实有效,模块化了额外的分词问题
“${@:3}”
将跳过前两个参数,如果没有实际设置参数3和on,则不会执行任何操作;我已经在我的回答中添加了这一点,以及一些关于使用该表单与使用
shift
的注释。所以${@:3}应该执行参数3和on(如果存在)?为什么我当时在OP中发布的部分没有出现这种情况?@FutureShock,我建议将其扩展为双引号,如我的回答所示,但是是的,您的原始代码应该可以工作。这对我来说确实有效,将额外的分词问题模化。