Почему $argv стал пустым в zsh?

Использование sedдля удаления существующих цифр в начале каждой строки и nlдля нумерации строк особым образом:

$ sed 's/^[0-9]*//' file | nl -n rz -s '' -w 5
00001abc
00002def
00003ghi
00004jkl
00005mno
00006pqr
00007stu
00008vwx
00009yza
00010bcd

Опция nlзапрашивает нулевые -заполненные числа (-n rz, что также правильно -выравнивает числа, но здесь это неважно )без разделителя между номерами строк и данными (-s ''). Числа состоят из пяти цифр(-w 5).

nl— это утилита POSIX .

1
14.04.2020, 11:37
1 ответ

$0не является позиционным параметром, это не часть $@, это имя скрипта/функции. $*, $@и $argv— это один и тот же нормальный (не -разреженный )массив позиционных параметров, и все индексы массива начинаются с 1 в zsh, если вы не включите параметр ksharrays.

Но если вы включите опцию ksharraysдля индексов массива, чтобы они начинались с 0, вы заметите, что $argv[0]или ${@[0]}— это первый позиционный параметр:$1.

Ваша путаница может быть связана с массивами ksh93 -, такими как оболочки (, включая bash), где ${@:0:1}— это $0, хотя расширение "$@"не включает $0. Эта путаница является результатом того, что Korn решил, что индексы массива его оболочки начинаются с 0, хотя оболочка Bourne, на которой он основан, и большинство других оболочек и инструментов, используемых оболочкой, предпочли, чтобы их индексы массива начинались с 1.

]

Подробнее об этом в Есть ли причина, по которой первый элемент массива Zsh индексируется 1 вместо 0?

3
19.03.2021, 02:29

Теги

Похожие вопросы