файл а
#!/bin/zsh
echo $*
echo $0
echo ---
echo $argv
echo $argv[0]
когда команда
./a 1 2
Это показывает:
1 2
./a
---
[0]
Когда команда:
zsh ./a 1 2
Это показывает:
1 2
./a
---
1 2
Почему 'zsh', будучи явной командой, может изменить результат? И почему argv[0] не назначается?
решение1
$0
не является позиционным параметром и не является его частью $@
, это имя скрипта/функции. $*
, $@
и $argv
представляют собой один и тот же обычный (неразреженный) массив позиционных параметров, и все индексы массива начинаются с 1 в zsh, если только вы не включите эту ksharrays
опцию.
Но если вы включите ksharrays
опцию, чтобы индексы массива начинались с 0, вы заметите, что $argv[0]
or ${@[0]}
является первым позиционным параметром: $1
.
Ваша путаница может быть вызвана массивами оболочек типа ksh93 (включая bash
), где ${@:0:1}
есть $0
, хотя расширение "$@"
не включает $0
. Эта путаница является результатом того, что Korn решила начать индексы своих массивов оболочек с 0, хотя оболочка Bourne, на которой она основана, и большинство других оболочек и инструментов, используемых оболочкой, решили начать индексы своих массивов с 1.
Подробнее об этом наЕсть ли причина, по которой первый элемент массива Zsh индексируется 1, а не 0?