Warum ist $argv in zsh leer?

Warum ist $argv in zsh leer?

Datei A

#!/bin/zsh
echo $*
echo $0

echo ---

echo $argv
echo $argv[0]

wenn der Befehl

./a 1 2

Es zeigt:

1 2
./a
---

[0]

Wenn der Befehl lautet:

zsh ./a 1 2

Es zeigt:

1 2
./a
---
1 2

Warum kann die Tatsache, dass 'zsh' als expliziter Befehl verwendet wird, das Ergebnis ändern? Und warum wird argv[0] nicht zugewiesen?

Antwort1

$0ist kein Positionsparameter, es ist nicht Teil von $@, es ist der Name des Skripts/der Funktion. $*, $@und $argvsind alle dasselbe normale (nicht spärliche) Array der Positionsparameter und alle Array-Indizes beginnen in zsh bei 1, sofern Sie die ksharraysOption nicht aktivieren.

Wenn Sie jedoch die ksharraysOption aktivieren, dass Array-Indizes bei 0 beginnen, werden Sie feststellen, dass $argv[0]oder ${@[0]}der erste Positionsparameter ist: $1.

Ihre Verwirrung rührt möglicherweise von Arrays ksh93-ähnlicher Shells (einschließlich bash) her, bei denen ${@:0:1}ist $0, obwohl die Erweiterung von "$@"nicht enthält $0. Diese Verwirrung ist darauf zurückzuführen, dass Korn die Array-Indizes seiner Shell bei 0 beginnen lässt, obwohl die Bourne-Shell, auf der es basiert, und die meisten anderen von der Shell verwendeten Shells und Tools ihre Array-Indizes bei 1 beginnen lassen.

Mehr dazu unterGibt es einen Grund, warum das erste Element eines Zsh-Arrays mit 1 statt mit 0 indiziert ist?

verwandte Informationen