In Bash müssen wir explizit die arithmetische Erweiterung verwenden, um einen in einer Variablen gespeicherten ganzzahligen Wert zu erhöhen.
i=1
i=$((i+1))
Andernfalls
i=1
i=i+1
wertet den Ausdruck nicht aus i+1
, sondern weist der Variablen den Ausdruck als Zeichenfolge zu.
Dies ist im Vergleich zu anderen Programmiersprachen, bei denen ein Ausdruck standardmäßig ausgewertet wird, sehr unnatürlich.
Gibt es im Design oder in Konzepten von Programmiersprachen ein Konzept oder eine Terminologie für eine solche Funktion in bash?
Was bringt es, einen Ausdruck nicht auszuwerten, sondern standardmäßig als Zeichenfolge zu behandeln?
Bezieht sich diese Funktion auf den Zeitpunkt der Bewertung, z. B. die verzögerte Bewertung?
Vielen Dank.
Antworten:
Hier gibt es kein spezielles Konzept. Stattdessen ist alles in der Shell eine Literalzeichenfolge, es sei denn, Sie verwenden explizit eine Erweiterung. Diese Entwurfsentscheidung erleichtert die Zuweisung von Literalwerten. Dies ist der Hauptanwendungsfall für Zuweisungen:
sucht nicht nach einer aufgerufenen Variablen
value
, sondern verwendet die Zeichenfolgevalue
wörtlich. In Bash sind die meisten „Sonderzeichen“ wie+ - /
usw. in keiner Weise besonders - sie sind nur Teil von wörtlichen Wörtern, genau wie alphabetische Zeichen.Die Erweiterungssyntax ermöglicht es uns, Werte einfach in eine Vorlage einzubetten, z
(Beachten Sie, dass in der Shell Anführungszeichen Zeichenfolgen mögen
'…'
oder"…"
nicht begrenzen, sondern stattdessen ändern, welche Erweiterungen angewendet werden. Einfache Anführungszeichen unterdrücken alle Erweiterungen und die Wortaufteilung, doppelte Anführungszeichen unterdrücken die Wortaufteilung und die Glob-Erweiterung, nicht jedoch die variable Erweiterung, die arithmetische Erweiterung (nur Bash). ., oder die Befehlssubstitutions Die folgenden Worte sind äquivalent:foo\ bar
,foo' 'bar
,'foo bar'
).Eine Konsequenz des Ansatzes „Alles ist standardmäßig eine Zeichenfolge“ ist, dass Programme, die nicht nur einfache Zeichenfolgen verwenden, komplizierter werden. Die Array-Syntax von Bash ist notorisch verwirrend. Die arithmetische Erweiterung ist nicht offensichtlich. Solche Programme eignen sich jedoch nicht am besten für Shell-Skripte.
Empfohlene Lektüre: Die POSIX-Beschreibung der Shell-Syntax und -Semantik: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
quelle
Sie können es so funktionieren lassen, wenn Sie möchten. Alles in der Shell ist eine Literalzeichenfolge, es sei denn, Sie sagen ausdrücklich, dass es sich um etwas anderes handelt. Beispiel: Folgendes druckt 2:
Sie müssen der Shell nur mitteilen, dass die Variable eine Ganzzahl anstelle einer Zeichenfolge ist. Das Gleiche gilt, wenn die Variable ein Array sein soll.
quelle
Es ist der
Regeln für diese Sprache.
Für Bash gelten die Regeln, dass Text wörtlich ist, sofern Sie nicht das
"#{name}"
Format verwenden.Siehe auch https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
quelle
Das Konzept hier ist "Abwärtskompatibilität". Die Bourne-Shell hat alles als Zeichenfolgen behandelt, sodass Bash standardmäßig ebenfalls ausgeführt werden muss, da sonst alle Pre-Bash-Skripte beschädigt werden.
quelle