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
$0
ist kein Positionsparameter, es ist nicht Teil von $@
, es ist der Name des Skripts/der Funktion. $*
, $@
und $argv
sind alle dasselbe normale (nicht spärliche) Array der Positionsparameter und alle Array-Indizes beginnen in zsh bei 1, sofern Sie die ksharrays
Option nicht aktivieren.
Wenn Sie jedoch die ksharrays
Option 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?