在鱼群中,范围是基于1的,并且包括两个极端,unsurprisingly在需要零长度范围时会导致问题。
尤其是在我将第一个参数拆分为自己的消费的情况下,我想转发其余的参数-可能没有! -一些命令。如果这是Python,我可以做类似的事情:
my_arg = sys.argv[1]
other_args = sys.argv[2:]
但是,不幸的是,将其直接翻译成鱼在极端情况下不起作用;考虑
set -l my_arg $argv[1]
set -l other_args $argv[2..-1]
(我的索引与在鱼的索引基于1的索引中相同,$argv
不包括sys.argv[0]
的索引)
只要有足够的论据,此方法就可以正常工作;例如,如果我使用参数a b c d e
调用命令,则会得到$my_arg = a
和$other_args = b c d e
。
但是,如果我仅用a
调用它,other_args
也会令人惊讶地设置为a
。这是由于-1
实际上已扩展为某种(count $argv)
效果的事实,因此上面的语句等效于
set -l other_args $argv[2..1]
,它是从不存在的元素2到存在的元素1( inclusive )的倒置范围,其归结为纯$argv[1]
。
为避免此问题,当前我正在使用这种可怕的解决方法
set -l other_args $argv[2..(expr (count $argv) + 1)]
可以确保最后一个索引比最后一个索引 ,从而将范围强制为“直的”索引,尽管可能完全超出范围(根据需要返回空列表)。 / p>
但是,我想知道:有没有更好的解决方案?
答案 0 :(得分:3)
但是,我想知道:有没有更好的解决方案?
升级到3.0。这是2.7中修复的错误。
现在的工作方式是,如果范围中的索引中只有一个为负,则它将始终被解释为两个中的较大者,因此如果结果为负,则迭代必须继续进行。 / p>
如果索引实际上并不大,那么将导致不包含任何元素,而这正是您想要的。