Aufgrund meiner Erfahrung mit modernen Programmier- und Skriptsprachen sind die meisten Programmierer daran gewöhnt, das erste Element eines Arrays mit 0 als Index zu bezeichnen.
Gibt es wesentliche Vorteile bei der Verwendung von 1 ?
Ich bin sicher, ich habe von mehr Sprachen als Zsh gehört, die sich mit Arrays ähnlich verhalten. Es ist in Ordnung für mich, da es genauso bequem ist.
Da jedoch zuvor veröffentlichte und weit verbreitete Shell-Skriptsprachen wie ksh und bash alle 0 verwenden, warum sollte sich jemand dafür entscheiden, diesen gemeinsamen "Standard" zu ändern?
Meine sofortige Antwort auf meine Frage wäre "natürlich nicht";
Die einzige Erklärung, die ich in Bezug auf dieses etwas "exklusive" Feature für Shells finden kann, wäre " sie haben dies nur getan, um ihre coole Shell ein bisschen besser zur Geltung zu bringen ".
Ich weiß jedoch nicht viel über Zsh oder seine Geschichte, und es ist sehr wahrscheinlich, dass meine triviale Theorie dazu keinen Sinn ergibt.
Gibt es eine Erklärung dafür? Oder ist es nur aus persönlichem Geschmack?
csh
, bei dem auch eine einbasierte Array-Indizierung verwendet wurde.Antworten:
awk
,tcl
zumindest, und Werkzeuge typischerweise aus der Schale verwendet wird (cut -f1-3
,head -n 3
,sort -k1,3
,cal 1 2015
,comm -1
) bei 1 beginnensed
,ed
,vi
Anzahl ihre Linien von 1 ...$@
beginnt bei 1. zsh entspricht der Behandlung von$@
(wie in Bourne) oder$argv
(wie in csh). Sehen Sie, wie verwirrend es ist,ksh
wenn${@:0:1}
Sie beispielsweise nicht den ersten Positionsparameter erhalten.$a[1]
. Dies bedeutet auch, dass die Anzahl der Elemente mit dem letzten Index identisch ist (in zsh wie in den meisten anderen Shells mit Ausnahme von ksh sind Arrays nicht spärlich).a[1]
denn das erste Element stimmt mita[-1]
dem letzten überein .Die Frage sollte also lauten: Was ist in David Korns Kopf geraten, damit seine Arrays bei 0 beginnen?
quelle
$0
ist kein Positionsparameter. Es ist nicht Teil von$@
."$@"
ist"$1" "$2" ...
. Wenn es um Funktionen geht, sehen Sie in vielen Shells, dass dies"$@"
die Argumente für die Funktion sind, während$0
der Skriptpfad (oder Shell argv [0], wenn kein Skript ausgeführt wird)Ich denke, die plausibelste Antwort auf diese Frage ist das eingebaute Reverse-Array von
zsh
Wenn Sie ein Array mit 4 Elementen haben, nehmen wir an,
myvar=(1 2 3 4)
Sie möchten auf das 4. Element zugreifenprint $myvar[4]
, oder?Wenn Sie jedoch eine Schleife erstellen möchten, in der die Elemente in diesem Array rückwärts aufgelistet werden, müssen nur negative Indizes verwendet werden:
Dies sollte erklären, da Sie ab Null keines dieser Elemente erreichen, da es kein Element gibt
-0
.Der zweite Grund dafür ist wahrscheinlich, dass der C-Code, der sich auf Variablen in zsh bezieht , Array-Indizes verwendet
int
oderdouble int
definiert. Da hier das Zweierkomplement zur Darstellung negativer Zahlen verwendet wird, gibt es keine Möglichkeit zur Darstellung-0
( Null mit Vorzeichen ), wie dies bei float möglich ist Punktvariablen.Wenn Sie es wirklich gewohnt sind, Indizes zu erstellen, die bei 0 beginnen, empfehle ich Ihnen, die
KSH_ARRAYS
Option zu verwenden, um dies zu beheben.Und der Haken von @cuonglm Kommentar nehmen, die
csh
implementierten Funktionen aufzsh
erläutert hier . Es scheint kein historischer Grund zu sein, sondern ein Weg, ein angenehmes Arbeitsumfeld für diejenigen zu schaffen, die es gewohnt sindcsh
quelle
-
bei Arrays mit 0-Index das mit~
.bash
. Ich denke, es behandelt negative Indizes für Set- Elemente als Syntax-Zucker, aber sonst nicht. kann mich nicht erinnern. Aus meiner Sicht sollten die Leute einfach ein Verzeichnis erstellen und Dateien für alles verwenden, was sie in den gesamten Shell-Status einfügen. Sie können diese Elemente beliebig indizieren.~
ist binäre Inversion.~0
ist-1
. (Alle Bits werden umgedreht, dies hängt davon ab, wie negative Zahlen normalerweise bitweise dargestellt werden.) Auf einem nicht gesetzten Array oder einem Array mit nur einem Element des Index 0 geben ein [0], ein [-0], ein [-1] und ein [~ 0] dasselbe in einem ksh-ähnlichen Array.~
als-index
es nicht funktioniert hat. Ich schätze, alles was ich getan habe war~-index
. Ja. das klingt richtig Ja! und das funktioniert natürlich auch für nicht gesetzte elemente. Also, ich denke, der Kommentar oben sollte sein - für 0-indizierte Arrays hinzufügen~
. Ich denke, es hat den -1-Teil vielleicht einfacher gehandhabt. Ich weiß nicht. Es ist im Moment nicht an die Spitze meines Gedächtnisses