IT-Academy Logo
Sign Up Login Help
Home - Betriebssysteme - Unix - Allgemeines - Command substitution der Shell



Command substitution der Shell

Es wird die command substitution der shell erklaert.


Autor: Franz Schaefer (mond)
Datum: 23-01-2002, 19:30:43
Referenzen: man bash
Schwierigkeit: Anfänger
Ansichten: 3350x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Übersicht:

vor kurzem haben wir gelernt wie die shell den inhalt einver variable an
einer stelle in der commandline einsetzten kann:

echo $USER

wuerde den inhalt der environment varibale $USER an der stelle dort
einsetzten und der eche befehl wuerde diesen wert dann ausgeben.

anstatt den inhalt einer variable in die commandline einzusetzten kann man
auch die ausgabe eines beliebigen befehls setzten. also z.b.:

echo heute ist der $(date)

das $( ) wird von der shell ersetzt mit der ausgabe des zwischen den
klammern stehenden befehls.

z.b.:

echo bli $(echo bla) blo

wirde "bli bla blo" ausgeben. nicht sehr sinnvoll aber demonstriert wie
das ganze funktioniert:

die shell fuehrt zuerst echo bla aus das ergebniss ist "bla" das wirt
zwischen bli und blo eingesetzt d.h. es wird dann der befehl:

echo bli bla blo

ausgefuerht..

statt des $( ) kann man auch ` ` schreiben also die verkehrten einfachen
anfuehrungszeichen (backgrave). ist aber meiner meinung nicht so gut
lesbar. ich bevorzuge die $( ) schreibweise. manche aeltere shells kennen
allerdings die $( ) schreibweise nicht. will man also portable script
schreiben die auch auf anderen shells als der bash funktionieren so sind
die ` (back grave) substition zu bevorzugen.

wir haben also jetzt die moeglichkeit befehle zu schreiben die wiederum
andere befehle aufrufen..

nagut ein sinnvolleres beispiel fuer die verwendung?

die verwendungsmoeglichkeit sind natuerlich endlos. angenommen du hast ein
file in dem in jeder zeile der name eines wichtigen files steht dass du
jeden tag auf einen anderen server kopiern willst und es sind viele files
und du willst sie nicht immer haendisch eintippen.

legen wir uns z.b. so ein file an:

echo *.txt arbeiten/*.{txt,gif,jpg,html} > wichtige.txt

scp $(cat wichtige.txt) backupserver.irgendwo.at:backup/

dieser befehle wurde also jetzt alle im file wichtige.txt angegebenen files
kopieren.

oder:

du willst dir ein shell skript mit dem namen: tagebuch schreien dass jedes
mal wenn du es aufrust den joe startet mit dem file

/home/maxmeier/tagebuecher/tagebuch2001.txt

und dir an das ende des files das aktuelle datum schreibt. und dir den joe
aufruft. das jahr soll natuelrich automatisch geschrieben werden. das scirpt
koennte also so aussehn:

#!/bin/bash
TBUCH=$HOME/tagebuecher/tagebuch$(date +%Y).txt
echo >> $TBUCH
echo log buch eintrag auf $(hostname) fuer $USER am $(date) >> $TBUCH
joe +99999999 $TBUCH
echo >> $TBUCH
echo ================================================== >> $TBUCH
echo >> $TBUCH


was tut dieses script?

die erste zeile: #!/bin/bash sagt dass es ein bash script ist
die zweite zeile: setzt die variable TBUCH dabei wird das aktuelle jahr
eingesetzt (der befehl date +%Y gibt nur das jahr aus) und das jahr wird
dort an der stelle eingefuegt. $HOME wird durch das homeverzeichniss
ersetzt.

der wert der variablen TBUCH waere also an dieser stelle z.b.:

/home/maxmeier/tagebuecher/tagebuch2001.txt

die naechster zeile haengt an dieses file eine leerzeile an. ( ein > alleine
wuerde die datein ueberschrieben. zwei >> bedeutet die ausgabe des befehls
anfuegen.

die naechste zeile fuegt den text:

log buch eintrag auf deincomputername fuer maxmeier am Mon Dec 10 13:04:36 MET 2001

ein. (der befehl hostname gibt immer den aktuellen namen deines computers
aus. $USER ist dein username und der befehl date -R gibt das aktuelle datum
aus.

danach wird joe aufgerufen. mit +123 wuerde er beim starten an die zeile 123
springen. da wir aber eine so grosse zahl angegeben haben spring joe immer
gleich ans ende. dort wollen wir ja unseren tagebuch text anfuegen.

nach dem benden von joe werden dann noch 2 leerzeilen und eine line mit =
zeichen angefuegt.

um das script zu testen wuerdest du es also in ein file mit dem namen
"tagebuch" speichern und es ausfuerbar machen:

chmod ugo+r tagebuch

dann koenntest du es mit:

./tagebuch

anstarten..


(vorher aber noch

mkdir tagebuecher

nicht vergessen)


EXERCISES:

* versuche einer environment variablen den aktuellen wert der seit
1.1.1970 vergangenen sekunden zuzuweisen.

( date +%s koennte hierfuer nueztlich sein. siehe dazu auch die man page
von date )

* gibt mit echo den wert aus.

* in einem file namens wichtig.txt steht in jeder zeile der name eines
verzeichnisses das mit tar gebackupt werden soll. wie koennte man mit
command subsitution den tar befehl aufrufen so dass er genau diese
verzeichnisse backupt?

______________________________________________
CD ist ein service von SILVER SERVER
der inhalt unterliegt der GFDL
_______________________________________________



[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04511
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06248
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0