В рыбных массивах диапазоны основаны на единицах и включают обе крайности, что, неудивительно, что 1002 *, приводит к проблемам, когда требуются диапазоны нулевой длины.
В частности, я нахожусь в ситуации, когда я выделил первые аргументы для своего собственного потребления, и я хочу перевести остальные из них - которых может не быть! - к какой-то команде. Если бы это был 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, включительно , который сводится к обычному $argv[1]
.
Чтобы избежать этой проблемы, в настоящее время я использую этот ужасный обходной путь
set -l other_args $argv[2..(expr (count $argv) + 1)]
, который гарантирует, что последний индекс равен один за последним, что приводит к тому, что диапазон является «прямым», хотя, возможно, и полностью выходит за пределы диапазона (который при необходимости возвращает пустой список).
Однако мне интересно: есть ли лучшее решение, которое я пропускаю?