Folgendes berücksichtigen:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
Im Grunde war ich versuche , Funktionen zu erklären 1
und 0
welche wären Kürzel für true
und false
, aber wie man sehen kann ich lief in Probleme mit numerischen Namen in Funktionen. Das gleiche Verhalten tritt bei Aliasnamen und zweistelligen Namen auf.
Frage ist "warum"? Wird es von POSIX beauftragt? oder nur eine Eigenart von Bourne-ähnlichen Muscheln?
Siehe auch verwandte Fragen zu dieser.
command-line
bash
dash-shell
ksh
Sergiy Kolodyazhnyy
quelle
quelle
0
es sichtrue
um Shell-Scripting handelt und dies1
istfalse
(tatsächlich wird jede Nicht-Null als falsch behandelt), falls jemand, der dies liest, es nicht weiß. Dies ist rückwärts von den meisten anderen Programmiersprachen.true
in der Shell. Bei der arithmetischen Erweiterung werden die$((...))
Rückgabestatus jedoch umgedreht - 1 isttrue
und 0 stehtfalse
für Konsistenz mit der C-Sprachsyntax. Versuchen Sie zum Beispiel,bash -c 'echo $((1==1));echo $((1==2))'
was ich außerhalb dieser Frage zu tun versuchte, war tatsächlich das Verhalten "umzukehren". Sehen Sie sich das letzte Beispiel meiner Antwort hier an, um zu sehen, was genau ich versucht habe. Dumme Idee, aber funktioniert trotzdemAntworten:
POSIX sagt:
Und:
Ein Wort, das mit einer Ziffer beginnt, kann also kein Funktionsname sein.
quelle
1L
bedeuten? Ein Funktionsname? Oder einlong int
wörtliches?()
möglicherweise darin enthaltenen Argumenten, die einen Aufruf der betreffenden Funktion bezeichnen (und den Wert annehmen, der von der aufgerufenen Funktion zurückgegeben wird). Wenn Sie also eine Funktionint f() { return 42; }
in C haben,f
ist diese in einem Zeigerkontext gültig und in einem Ganzzeigerkontextf()
ohne Zeiger.Dies ist in vielen Sprachen ein Standard, um Verwechslungen zwischen mathematischen Operationen und Variablen oder Funktionen oder Methoden zu vermeiden.
Erwägen:
Wie Sie sehen können, kann das spätere Ausführen von Mathematik in einem Programm sehr verwirrend werden, wenn Zahlen als Variablen- oder Funktionsnamen zulässig sind, und Sie müssten kreative Problemumgehungen finden, wenn Sie später tatsächlich mit diesen Zahlen rechnen müssen. In einigen Sprachen kann es auch zu unerwarteten Ergebnissen kommen. Stellen Sie sich vor, Sie erhöhen eine Zahl für eine Schleife, aber eine der Ziffern ist bereits eine Variable, die einer Zeichenfolge entspricht. Es würde sofort einen Fehler auslösen. Wenn Sie nicht der ursprüngliche Autor des Codes waren, kann es eine Weile dauern, bis dieser Fehler gefunden ist.
Kurz gesagt, aus diesem Grund können Sie in den meisten Sprachen keine Zahl als Namen einer Variablen, Funktion, Methode usw. verwenden.
quelle
$
um erweitert zu werden", aber wenn die Shell von anderen Sprachen inspiriert ist, ist das in Ordnung, denke ich, und in arithmetischen Erweiterungsvariablen((
müssen keine führenden Variablen vorhanden sein$
. OK, ich kann das verstehen$
, also gibt es das. Aber das ist wahrscheinlich zweitrangig gegenüber dem anderen Grund, "nur der allgemeinen Konvention zu0
für die Shell oder Skriptnamen1
,2
..., für Positionsparameter,*
für sie verbunden sind ,-
für die aktivierten Optionen,?
für den letzten Exit - Status, und!
für die PID des letzten asynchronen Jobs. (Also auch in$((
))
die$
oft benötigt werden .) Der hier gezeigte Code die vorgeschlagene Begründung zu demonstrieren ist kein Skript für jede Bourne - Shell-Stil, da gibt es keine Möglichkeit , es so zu zeigen, wie sie nicht gelten zu Sie.Betrachten Sie in C einen Ausdruck wie:
Ist
1000l
eine Variable oder eine Konstante? Da Variablennamen nicht mit einer Ziffer beginnen können, muss sie eine Konstante sein. Dies macht das Parsen einfacher und strenger (Tippfehler wie1000k
können leicht abgefangen werden). Es ist auch einfacher, eine einzige Regel für Variablen und Funktionsnamen zu haben, da Funktionen auch als Variablen behandelt werden können. Jetzt sind Parser natürlich viel komplexer und leistungsfähiger, und wir haben Dinge wie benutzerdefinierte Literale in C ++. Aber in jenen alten Tagen der Vorgeschichte könnte ein Opfer unnötiger Flexibilität Ihre Kompilierungs- (oder Interpretations-) Zeiten viel kürzer machen (und die Leute beschweren sich immer noch über C ++ - Kompilierungszeiten).Und Sie können die Auswirkungen eines C-Einflusses in der gesamten Shell-Sprache sehen. Es ist daher nicht verwunderlich, dass die Bourne-Shell (oder C-Shell) und damit POSIX die Klasse der zulässigen Namen auf die gleiche wie die von C beschränkt hat.
quelle
&&
und||
die mangelnde Unterstützung für die ASCII-Null in Strings.