• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Einfaches Shellscripting

Suven

Empire
Registriert
08.10.09
Beiträge
85
Hallo!

Ich hatte noch nie mit Shell zu tun. Nun bringt mich Geektol dazu doch ein wenig umexperementieren zu wollen.

Wenn ich das richtig interpretiere werden Variablen zwar deklariert/initialisiert indem man einfach ihren namen = wert schreibt, wenn man sie aber irgendwo verwenden möchte benötige ich grundsätzlich $name oder?

Im ersten Schritt möchte ich einfach nur (29 - (date +%d)) mit einem Text ausgeben.. Ich habs so versucht, bekomme aber keine Ausgabe:

Code:
date = date +%d
let date = 29 - $date

echo $date ' Text'

das let hatte ich nicht von Beginn an, wenn ich richtig gegooglet habe, benötigt man das aber grundsätzlich bei Rechnungen, oder?

Das in meinem Fallbeispiel die Zahl negativ werden kann, ist mir erstmal egal (;

Ich bin mir auch nicht so ganz im klaren wonach ich googlen muss. Laut Apple Dev und Wiki gibt es mehrere Arten von Shell (zB Bash) aber in dem Manuskript von Apple steht nicht ausdrücklich, welches das nativ Genutzte ist óo

Edit:
Zweiter Versuch ohne Ausgabe
Code:
#!/bin/sh
declare -i vdate='date +%d'
vtest = $((29 - $vdate))
echo $vtest
 
Zuletzt bearbeitet:
Code:
DATE=$(date +%d)
Beachte: keine Leerzeichen vor "=" und um den String eines Befehls zu bekomen, musste den befehl in $(Befehl) reinstecken. Schreibe Variabeln am besten groß (eigentlich macht man das nur mit Konstanten) oder in camelCase, damit du nicht mit Befehlen in die Quere kommst.



Code:
let DATE=29-$DATE
oder
Code:
let DATE="29 - $DATE"
würde das zweite sein. Da musst du " und nicht ' verwenden, weil in ' die Variable $DATE nicht expandiert wird - oder am besten gar keine Leerzeichen.



Ich würde das übrigens so machen (ist ja nicht viel)
Code:
echo "$(( 29 - $(date +%d) ))   Text"
 
Ich seh grad, dass du im script #!/bin/sh benutzt hast.

Nimm besser #!/bin/bash. Die sollte zwar standardmäßig die default shell sein, aber falls es doch die c-shell ist, wird das obere nicht funktionieren.
 
Cool danke!

Das funktioniert 1:1 so wie du es gepostet hast. Und deine Erklärung mit den Spaces wird mir auch in Zukunft helfen. Wusste nicht das die Syntax so penibel ist.
 
Keine Panik.
Wenn du mal so weit bist das hier zu verstehen (und darüber schmunzeln zu können :-) ), bist du "voll fit".
Code:
X='X=%s;printf "$X" "\x27$X\x27"\n';printf "$X" "'$X'"
(Just for fun. :-) )
 
Hi,

ich will ja nix sagen, aber das unix date kann soooooo viel...

date -v-29d "+%d"

bringt das Datum von vor 29 Tagen und davon nur den Tag (%d). Ich geh mal davon aus, das der Sinn hinter $date - 29 ist, bzw. 29 - $date.

und mydate=$(date -v-29d "+%d") schreibt das ganze nach $mydate.

Das GNU date würde das übrigens so machen: mydate=$(date --date="29 days ago" "+%d")

cu
 
Viele Wege führen nach Rom :-)

Du hast aber vollkommen Recht.
Den Vorteil an meiner Lösung sehe ich in der Portierbarkeit. Funzt auf Linux & auf Mac bzw. BSD. :-)

BTW: Korrigier mich, falls ich falsch liege, aber ist es nicht das BSD-Date, was das ermöglicht?
 
BSE!? BSD! ;-)

Ich fragte, weil du das gesagt hast:
ich will ja nix sagen, aber das unix date kann soooooo viel...
Bedenke: BSD ist ein Unix, es ist nicht Unix itself. :-)
Hmm, sebst das ist niht ganz richtig. BSD hat seinen Ursprung in Unix... das trifft's wohl eher.

date --date="29 days ago" "+%d" der GNU (nicht Linux!) Weg :-)
Auf den meisten (alle?) Linux-Distris ist GNU-date drauf. Ich kenne zumindest keine, auf der etwas anderes drauf wäre - aber man kann ja nicht jede Linux-Distri kennen. ;-)
 

Hach, freudscher Vertipper :-D

Ich fragte, weil du das gesagt hast:

Bedenke: BSD ist ein Unix, es ist nicht Unix itself. :-)
Hmm, sebst das ist niht ganz richtig. BSD hat seinen Ursprung in Unix... das trifft's wohl eher.
Hm ja. Um das Haar jetzt mal zu spalten: Eigentlich gibt es *DAS* Unix in der Form sowieso nicht. Jedes Unix-artige OS setzt sich aus dem entsprechenden Kernel und dem dazugehörigen Userland zusammen. Zu einem Unix wird es letztlich erst durch Einhaltung der Spezifikationen der Open Group. Wobei die, je nachdem, mal mehr und mal weniger streng sind.

Mac OS X ist übrigens seit 10.5 auch nach SUS Unix 03 zertifiziert ( http://www.opengroup.org/openbrand/register/xy.htm ).

Installierst du dir jetzt das entsprechende Userland (e.g.: coreutils von GNU) hast du die entsprechenden Tools, aber keinen Standard mehr.

Es gibt noch andere solcher Systeme. Z.b. ist der GNU/HURD Kernel i.d.R. mit GNU Userland zusammen verfügbar. Bzw. gibt es Distributionen (Debian) die diesen Kernel komplett unterstützen.

Auf den meisten (alle?) Linux-Distris ist GNU-date drauf. Ich kenne zumindest keine, auf der etwas anderes drauf wäre - aber man kann ja nicht jede Linux-Distri kennen. ;-)
s.o.

cu
 
Ich hab da auch mal sehr einfache Frage, aber ich bekomme es einfach nicht hin. Und im Internet finde ich leider auch nichts wirklich, was mir weiterhilft. Ich soll ins Homeverzeichnis wechseln. Also dachte ich mir:
Code:
cd $Home

Geht aber nicht. Es kommt zwar keine Fehlermeldung, aber passieren tut auch nix...Wo ist das Problem? Auch wenn ich nur "cd .." oder ähnliches hinschreibe, passiert nix...
 
1. $HOME
2. warum klappt denn cd .. nicht?
3. Wo gibst du das überhaupt alles ein?
4. Was sagt denn die Ausgabe von "pwd" nach der Eingabe der Befehle?
 
Wo ist das Problem? Auch wenn ich nur "cd .." oder ähnliches hinschreibe, passiert nix...
1) Upper/lowercase matters. Seriously.
2) Um nach $HOME zu wechseln, genügt auch ein simples "cd" (ohne Punkte danach)
3) "cd .." bringt dich stattdessen jeweils einen Ordner höher.
 
1. $HOME
2. warum klappt denn cd .. nicht?
3. Wo gibst du das überhaupt alles ein?
4. Was sagt denn die Ausgabe von "pwd" nach der Eingabe der Befehle?

zu 1. habe es großgeschrieben, war nur hier ein schreibfehler
zu 2. das ist ja meine frage ;)
zu 3. in einer sh-datei, die ich dann über das terminal ausführe.
zu 4. pwd sagt, dass ich danach immernoch im selben Verzeichnis bin.

@Rastafari
auch wenn ich nur cd eingebe, passiert leider nichts... Ist cd überhaupt richtig, wenn ich das über Shellskripting machen möchte? (ist evtl. nicht rüber gekommen im ersten post, geb ich zu)
 
in einer sh-datei, die ich dann über das terminal ausführe.
Mit dem Start einer ausführbaren Skriptdatei betrittst du eine neue, untergeordnete Instanz der Shell.
Dort gelten die Änderungen, die du dort drin vornimmst.
Ist das Skript am Ende angelangt, wird die untergeordnete Shell beendet und du kehrst zur vorherigen Ebene zurück.
Dort findest du den gleichen Zustand vor, den du unmittelbar vor dem Aufruf der Skriptdatei hattest.
Die in der Subshell vorgenommenen Einstellungen wie "aktueller Ordner", Variablenzuweisungen oder -änderungen haben auf die übergeordnete Instanz keinerlei Auswirkung.

Willst du den Programmtext eines Skripts nicht in einer Subshell, sondern in der aktuellen Shellinstanz ausführen (so als ob du es "live" tippen würdest), benutzt du das "source" Kommando.
Dafür gibt es zwei alternative Schreibweisen:
Code:
source [I]Skript.sh[/I]

. [I]Skript.sh[/I]
Die Datei "Skript.sh" braucht in diesem Fall nicht mit dem Attribut "ausführbar" markiert zu sein. Jede beliebige Datei kann "gesourced" werden, solange ihr Inhalt nur ein syntaktisch korrektes Skript ist. Das Suffix *.sh ist ebenfalls nicht notwendig, sondern nur eine der Übersicht dienende Konvention.
 
Hi,

das ist schnell erklärt:

"$HOME" enthält den Pfad zu deinem Homeverzeichnis. Du kannst ihn dir mal ausgeben lassen:

Code:
$ echo $HOME
/Users/steinchen
$
Das bedeutet das du in deinen Scripts immer $HOME benutzen kannst um zum Homeverzeichnis des Nutzers zurückzukehren unter dessen Name das Skript läuft.

Wenn du einen Terminal startest bist du immer direkt in deinem Homeverzeichnis. Wenn du dir den aktuellen Pfad und anschließend den Inhalt von $HOME ausgeben lässt, wirst du sehen das sie identisch sind:

Code:
$ echo $HOME
/Users/steinchen
$ pwd
/Users/steinchen
$
Das du in deinem Homeverzeichnis bist erkennst du auch an der Tilde "~" im Prompt:

Code:
rechnername:~ nutzername$
Ein "cd .." sollte dich in den Pfad darüber bringen und das Prompt sollte sich dadurch auch verändern:

Code:
mac:~ steinchen$ echo $HOME
/Users/steinchen
mac:~ steinchen$ pwd
/Users/steinchen
mac:~ steinchen$ cd ..
mac:Users steinchen$ pwd
/Users
mac:Users steinchen$
Solltest du ein Skript starten das eine eigene Shell startet, so wird diese übrigens die Umgebung erben und weiternutzen solange du keine Loginshell daraus machst.

Kannst du ganz einfach ausprobieren:

Code:
$ export test="abc"
$ /bin/bash
$ echo $test
abc
$ exit
$
cu