Was ist das Programmiersprachenkonzept, um einen Ausdruck in bash nicht standardmäßig auszuwerten?

8

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.

Tim
quelle
Wer hat gesagt, Bash sei eine Programmiersprache? und nein, es liegt nicht an der faulen Bewertung: Dies gibt es auch in anderen Sprachen ohne das String-Problem
Christophe
8
@Wer sagte, Bash sei eine Programmiersprache? Nun, Wikipedia , Stack Overflow , Reddit , Wikibooks . Und das sind nur die, die ich nennen kann, bevor mir langweilig wird. Genau wie bei Java gibt es mehr Dinge, die den Namen Bash tragen als nur die Sprache. Aber ja, es gibt eine Bash-Programmiersprache.
candied_orange

Antworten:

15

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:

varname=value

sucht nicht nach einer aufgerufenen Variablen value, sondern verwendet die Zeichenfolge valuewö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

echo "Hello ${name}!"

(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

amon
quelle
7

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:

typeset -i x
x=1
x=x+1
echo $x

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.

Jerry Jeremiah
quelle
Was Sie sagen, ist wahr und hilfreich, beantwortet aber nicht die eigentliche Frage: "Was ist das Programmiersprachenkonzept [...]"?
Andres F.
0

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.

Jeremy
quelle