Arrays 有没有更好的方法来获取从某个索引到结尾可能为空的数组切片/范围?

Arrays 有没有更好的方法来获取从某个索引到结尾可能为空的数组切片/范围?,arrays,slice,fish,Arrays,Slice,Fish,在鱼类阵列中,范围是一个基础,包括两个极端,这在可能需要零长度范围时会导致问题 特别是,我的情况是,我为自己的消费划分了第一个论点,我想把其余的论点转发出去——可能没有听指挥。如果这是Python,我可以执行以下操作: my_arg = sys.argv[1] other_args = sys.argv[2:] 然而,不幸的是,将此直接转换为fish在edge情况下不起作用;考虑 set -l my_arg $argv[1] set -l other_args $argv[2..-1] (我

在鱼类阵列中,范围是一个基础,包括两个极端,这在可能需要零长度范围时会导致问题

特别是,我的情况是,我为自己的消费划分了第一个论点,我想把其余的论点转发出去——可能没有听指挥。如果这是Python,我可以执行以下操作:

my_arg = sys.argv[1]
other_args = sys.argv[2:]
然而,不幸的是,将此直接转换为fish在edge情况下不起作用;考虑

set -l my_arg $argv[1]
set -l other_args $argv[2..-1]
(我保留了相同的索引,因为在fish索引中,索引是基于1的,
$argv
不包括
sys.argv[0]

只要有足够的论据,这就行了;例如,如果我使用参数
abcde
调用我的命令,我将得到
$my_arg=a
$other_args=bbcde

但是,如果我仅使用
a
调用它,
其他参数
也会意外地设置为
a
。这是因为
-1
实际上被扩展为
(count$argv)
,因此上面的语句相当于

set -l other_args $argv[2..1]
这是一个从不存在的元素2到存在的元素1(包括)的反向范围,可以归结为普通的
$argv[1]

为了避免这个问题,目前我正在使用这个可怕的解决方法

set -l other_args $argv[2..(expr (count $argv) + 1)]
它确保最后一个索引是最后一个索引,强制范围为“直”索引,尽管可能完全超出范围(根据需要返回空列表)

然而,我想知道:有没有更好的解决方案,我错过了

然而,我想知道:有没有更好的解决方案,我错过了

升级到3.0。这是2.7中的一个bug,已经修复了

现在的工作方式是,如果一个范围内只有一个指数为负,它将始终被解释为两个指数中的较大者,因此在负结束时,迭代将被迫进行


如果索引实际上没有变大,则不会生成任何元素,这正是您想要的。

太好了!不幸的是,我不确定我是否能够在使用此脚本的所有计算机上升级到fish 3,因此目前我必须保留该解决方案,但知道它已被修复很好。另一种解决方案是在使用它之前检查argv是否有2个元素:
set-q argv[2];设置-l other_args$argv[2..-1]
呃,我认为情况更糟,因为你必须重复两次起始索引(因此它更容易失去同步)。我只保留
expr
kludge。
expr
kludge启动一个外部进程,并且只对fish>=2.7起作用(因为这是第一个允许无效索引的版本)。至少在2.2.0之前检查fish的工作情况。在这种特殊情况下启动外部进程不是什么大问题,但是欢迎使用一些以前的兼容性;我会采纳你的解决方案。