Shell-Workshop (6)

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
In diesem Workshop geht es um Shell-Variablen.

Die Shell kann sich Werte merken; dafür stehen die Shell-Variablen zur Verfügung. Technisch gesehen sind es keine echten Variablen (symbolische Referenzen auf Speicherbereiche), sondern eigentlich nur Platzhalter für Texte, aber das merkt eigentlich keiner sofort. Shell-Variablen werden meist direkt durch eine Wertezuweisung angelegt (=). Bei ihrer Benutzung muss man ein '$' verwenden.

Man darf Buchstaben, Ziffern und den Unterstreichstrich bei der Definition verwenden. Vor und hinter das '=' bei der Definition darf keine Leerstelle verwendet werden. Bei der Nutzung kann der Variablenname zweckmäßigerweise in geschweifte Klammern (Akkoladen, braces oder curly brackets) gesetzt werden, um ihn von normalem Text abzugrenzen. Als wichtigste Operation gilt die Konkatenation; sie wird ohne Operator ausgeführt. Shell-Variablen werden oft per Konvention in Großbuchstaben notiert.
Rich (BBCode):
Syno> A=abc
Syno> echo $A
Syno> B=123
Syno> echo $A$B
abc123
Syno> echo ${A}xyz$B
abcxyz123
Syno> C=${A}d
Syno> echo $C
abcd

Man kann auch die Ausgabe eines Kommandos oder eines Tools einer Shell-Variablen zuordnen. Man sollte das aber mit Vorsicht bei größeren Zeichenketten nutzen. Die Shell hat meist einen beschränkten Pufferbereich für solche Operationen (<8192 Zeichen); auch können Sonderzeichen, Leerstellen oder Zeilenvorschübe für Irritationen sorgen. Deswegen sollte man auch hier immer mit der Option 'set -x' sich vergegenwärtigen, was man das so treibt.

Eine Kommandosubstitution für die Zuweisung kann per `...` (backqoutes) oder '$(...)' hergestellt werden:

Rich (BBCode):
Syno> UNAME=`uname`
Syno> echo $UNAME
Linux
Syno> SELF=$(whoami)
Syno> echo $SELF
root

Wenn ein Kommando auf diese Weise eine Liste von Werten, getrennt durch Leerstellen oder Tabulatoren, ausgibt, dann hilft meist ein Pipen (|) in den 'awk'. Dem 'awk' kann man als Aktion {...} die print-Anweisung und eine Feldreferenz ($1, $2, $3 ...) mitgeben. Allerdings muss man die '$' schützen, da sie sonst von der Shell interpretiert werden würden, also am besten mit einfachen Hochkomma einschließen. [uname siehe Shell-Workshop (1)]

Rich (BBCode):
Syno> U=$(uname -a)
Syno> echo $U
Linux Syno 2.6.15 #1157 Mon Apr 19 21:30:17 CST 2010 armv5tejl unknown
Syno> VERSION=$(uname -a | awk '{print $3}')
Syno> echo $VERSION
2.6.15

Eine Übersicht über alle Shell-Variablen erhält man mit 'set':

Rich (BBCode):
Syno> set
A='abc'
C='abcd'
HOME='/root'
IFS='
'
LOGNAME='root'
OLDPWD='/root'
OPTIND='1'
PAGER='more'
PATH='/usr/sbin:/bin:/usr/bin:/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/syno/bin:/usr/syno/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin'
PGDATA='/volume1/@database/pgsql'
PPID='14947'
PS1='Syno> '
PS2='> '
PS4='+ '
PWD='/root/workshop'
SELF='root'
SHELL='/bin/ash'
TERM='cons25'
U='Linux Syno 2.6.15 #1157 Mon Apr 19 21:30:17 CST 2010 armv5tejl unknown'
UNAME='Linux'
USER='root'
VERSION='2.6.15'
_='echo'

Man sieht, dass sich da schon jemand Mühe gegeben hat und einige Shell-Variablen vordefiniert hat. Unter dem Stichwort 'Environment' oder auf den Shell-Manual-Seiten werden die meisten dieser vordefinierten Variablen erläutert. Zum Beispiel gibt es die Shell-Variable PATH, die die Pfade enthält, wo die Shell automatisch nach den Programmdateien sucht, so dass man diese Pfade nicht immer bei Aufruf hinschreiben muss. Anmerkung: In der PATH-Variablen steht ganz schön viel Schrott drinne (doppelte Eintragungen); da müsste dringend mal jemand von den Synology-Entwicklern in den ganzen Start-Dateien aufräumen.

Man kann auch Shell-Variable durch die Tastatur oder eine Datei-Redirektion mit dem Kommando 'read' füllen:

Rich (BBCode):
Syno> read IN
das ist ein Text
Syno> echo $IN
das ist ein Text
Syno> read F1 F2 F3
das ist ein Text   <-- diesen Text muss man über die Tastatur eingeben
Syno> echo $F1
das
Syno> echo $F2
ist
Syno> echo $F3
ein Text
Syno> echo 'Hallo Welt' >text98
Syno> <text98 read TEXT
Syno> echo $TEXT
Hallo Welt

Die Redirektion '<text98' in der letzten read-Zeile kann übrigens irgendwo in der Zeile stehen, meist schreibt man sie so, dass man sofort sehen kann, worum es geht.

=======

Viel Spaß beim Experimentieren und set -x nicht vergessen.

Itari

PS. Noch was: alle Shell-Variablen sind nur temporär. Sobald man sich aus der Shell abmeldet, sind sie weg. Um Shell-Variablen auch 'überdauernd' (persistent) anzulegen, braucht man entsprechende Shell-Skript-Dateien, wie z.B. die .profile im jeweiligen HOME-Directory.

=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.

Shell-Workshop (5)
Shell-Workshop (7)
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat