Variablen tragen unter OpenVMS den Namen **Symbols** und können mehr als nur Zahlen und Buchstaben speichern.
======Gültigkeitsbereiche======
Symbols können entweder eine **lokale** oder **globale** Gültigkeit aufweisen.
Ein //lokales// Symbol hat nur eine begrenze Gültigkeit während ein //globales// Symbol auch über mehrere Prozessebenen hinweg, z.B. verzweigte Batch-Jobs, gültig sein kann.
======Definition======
Ein Symbol wird wie folgt definiert:
$ SYMBOL_NAME OPERATOR WERT
Das folgenden Beispiel erstellt ein lokales Symbol namens **FOO**, das den Wert "**BAR**" enthält:
$ FOO = BAR
Der Operator entscheidet über den Gültigkeitsbereich und den Datentyp des Symbols:
^Operator^Gültigkeitsbereich^Datentyp^
|=|lokal|String/Integer|
|:=|lokal|String|
|==|global|String/Integer|
|:==|global|String|
Einige weitere Beispiele:
$ FOO := BAR ! erstellt ein lokales Symbol FOO, das den String "BAR" enthält
$ ZAHL == 12 ! erstellt ein globales Symbol ZAHL, das die Zahl 12 speichert
$ BSP :== AB ! erstellt ein globales Symbol BSP; das den String "AB" erhält
======Ausgabe======
Der Inhalt von Symbole wird mithilfe des **[[computer:openvms:show|SHOW]]**-Befehls ausgegeben.
Angenommen, die folgenden beiden Symbole wurden definiert:
$ FOO = BAR
$ ZAHL = 1337
Die Ausgabe der Symbole erfolgt nun wie folgt:
$ SHOW SYMBOL FOO
FOO = "BAR"
$ SHOW SYMBOL ZAHL
ZAHL = 12 Hex = 0000000C Octal = 00000000014
Bei numerischen Symbolen wird der Wert in **dezimal** (//10er Basis//), **hexadezimal** (//16er Basis//) und **oktal** (//8er Basis//) ausgegeben.
======Befehlsaliase======
Wenn bereits vorhandene Kommentare oft mit bestimmten Qualifizierern ausgeführt werden, können diese in einem eigenen gleichnamigen Alias definiert werden.
Angenommen, Dateien werden immer auf der Druckerwarteschlange **PRINTERD** ausgedruckt - der folgende Alias (//übrigens ein globales String-Symbol//) verhindert, dass der Qualifizierer **/QUEUE=PRINTERD** jedes Mal explizit angegeben werden muss:
$ PRINT :== PRINT/QUEUE=PRINTERD
=====Abbreviations=====
In DCL werden Befehl oftmals abgekürzt - von nahezu jedem Befehl gibt es eine logische Kurzform, beispielsweise **DELETE**/**DEL** oder **EDIT**/**EDT**.
Eine solche **Abbreviation** wird z.B. wie folgt definiert:
$ PR*INT :== PRINT/QUEUE=PRINTERD
Der Befehlsalias **PRINT** führt den Befehl PRINT automatisch mit dem Qualifizierer **/QUEUE=PRINTERD** aus und kann auch als **PR** abgekürzt werden.
======Arithmetische Berechnungen======
Es ist auch möglich, mit Symbolen zu rechnen - hierfür stehen die üblichen 4 Operatoren zur Verfügung:
^Operator^Verwendung^
|**+**|Addition|
|**-**|Subtraktion|
|*****|Multiplikation|
|**/**|Division|
DCL kennt auch runde Klammern und verwendet diese zur Definition von Berechnungsreihenfolgen.
Zwei Beispiele:
$ ZAHL = 2 * (5+5)
$ SHOW SYMBOL ZAHL
ZAHL = 20 Hex = 00000014 Octal = 00000000024
$ ZAHLB = ZAHL * 2
$ SHOW SYMBOL ZAHLB
ZAHL = 40 Hex = 00000028 Octal = 00000000050
DCL kennt leider nur Ganzzahlen - Kommazahlen werden **nicht** unterstützt!
======String-Verkettung======
Strings können mithilfe des Plus-Operators aneinander gehängt werden:
$ WORT = "WELT"
$ WORT := "HALLO " + WORT
$ SHOW SYMBOL WORT
WORT = "HALLO WELT"
Da die Shell in aller Regel von rechts beginnt Kommandos abzuarbeiten, erhält das Symbol **WORT** den Wert "//HALLO WELT//".
======Entfernen======
Symbole werden mithilfe des **DELETE**-Kommandos entfernt - bei globalen Symbolen wird noch der Qualifizierer **/GLOBAL** benötigt:
$ WORTA = "Hallo"
$ WORTB == "Welt"
$ DELETE/SYMBOL WORTA
$ DELETE/SYMBOL/GLOBAL WORTB