Einfaches Shell-Skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
m@ddin
Beiträge: 203
Registriert: 28.05.2006 20:43:10
Kontaktdaten:

Einfaches Shell-Skript

Beitrag von m@ddin » 22.01.2008 21:13:05

Hi Leute!

Ich will mich ein bisschen in einfaches Shell-Skripting einarbeiten, dazu will ich mir eine Datei erstellen, die für mich bestimmte Befehle nacheinander ausführt. Im nächsten Schritt soll das dann alles noch erweitert werden. Konkret will ich in PostgreSQL eine Datenbank erstellen lassen, dies mache ich momentan immer so als root:

Code: Alles auswählen

su -m postgres
createdb -U postgres -O trac -E UTF8 datenbank_name
exit
Dies will ich vereinfachen, in dem ich einfaches Shell-Skript schreibe, dem ich nur den Projektnamen übergebe. Dazu habe ich folgende Datei erstellt:

Code: Alles auswählen

#!/bin/sh

su -m postgres
createdb -U postgres -O trac -E UTF8 $1
exit
Diese Datei als createTracDb.sh abgespeichert und noch ausführbar gemacht. Wenn ich die Datei allerdings aufrufe, bleibe ich der Benutzer postgres und die Datenbank wird nicht angelegt.

Was ist an der Datei falsch?

Danke & viele Grüße,
Martin

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.01.2008 22:31:15

von su wird eine Subshell aufgerufen, erst wenn du diese mit "exit" verläßt, wird das "createdb" Kommando ( allerdings unter dem aktuellen User ) aufgerufen.
So sollte es funktionieren:

Code: Alles auswählen

#!/bin/sh 

su -m -c "createdb -U postgres -O trac -E UTF8 $1" postgres 
Gruß
gms

m@ddin
Beiträge: 203
Registriert: 28.05.2006 20:43:10
Kontaktdaten:

Beitrag von m@ddin » 22.01.2008 23:00:15

Hi!

Danke, das funktioniert :) Noch eine Frage hätte: wie kann ich automatisch irgendwelche Eingaben machen? Ich will zum Beispiel für SVN-Projekte einen Default-Import machen, damit beim erstellen eines neuen SVN-Repositories automatisch die Ordner "trunk", "tags", "branches" erstellt werden. Da aber mein SVN über https:// erreichbar ist, muss ich, wenn ich den Import mache, einige Fragen beantworten. Kann man die auch von einem Skript aus eingeben?

Viele Grüße,
Martin

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 23.01.2008 20:33:16

Einen "Input" an ein Programm weiterleiten, kann man schon:
direkt von einer Datei ( z.B. /tmp/x.txt) an ein Programm ( z.B. awk ):

Code: Alles auswählen

gms@gms1 ~ $ echo "bla bla" >/tmp/x.txt
gms@gms1 ~ $ awk '{ print "input:\"" $0 "\""}' </tmp/x.txt
input:"bla bla"
mit eine "inline" ( im Shellscript ) erzeugten "temporären Datei":

Code: Alles auswählen

gms@gms1 ~ $ cat x.sh
#!/bin/bash

awk '{ print "input:\"" $0 "\""}' <<EOF
bla bla
EOF
gms@gms1 ~ $ ./x.sh
input:"bla bla"
über eine Pipe ( '|' ) von einem Programm ( z.B echo ) an ein anderes Programm ( z.B awk ):

Code: Alles auswählen

gms@gms1 ~ $ echo "bla  bla" | awk '{ print "input:\"" $0 "\""}'
input:"bla  bla"
ob damit die interaktive Fragen deines Programms beantwortet werden können, müßte man durch Tests herausfinden, besser man vermeidet diese.
z.B läßt sich die Passwortabfrage von ssh nicht auf diese Weise, die Passwortabfrage von passwd aber schon, beantworten:

Code: Alles auswählen

gms1 ~ # echo -e "a:B-c#D*e=F%g\na:B-c#D*e=F%g\n" | passwd testuser
Geben sie ein neues UNIX Passwort ein: Geben sie das neue UNIX Passwort erneut ein: passwd: Kennwort erfolgreich geändert
Gruß
gms

m@ddin
Beiträge: 203
Registriert: 28.05.2006 20:43:10
Kontaktdaten:

Beitrag von m@ddin » 23.01.2008 23:03:45

Hi!

Habs getestet, geht leider nicht :( Aber anscheinend gibt es einen die Fragen zu unterdrücken und danach eine Konfigurationsdatei anzupassen. Dann könnte man ja ein weiteres Script schreiben, dass diese Konfigurationsdatei bearbeitet? Ist das schwer?

Kann man in Shell-Programmierung auch Ausgaben unterdrücken so wie @echo off in .bat Dateien?

Danke & viele Grüße
Martin

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 24.01.2008 08:01:50

Du kannst z.B. den sterr-Kanal so unterdrücken: 2>/dev/null (wäre nur für Fehler)

Die "normale" Ausgabe von stdout ist die 1. Man kann auch beides in Kombination unterdrücken.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 24.01.2008 08:37:25

m@ddin hat geschrieben:Dann könnte man ja ein weiteres Script schreiben, dass diese Konfigurationsdatei bearbeitet? Ist das schwer?
Meistens nicht, selten doch :roll:

Gruß
gms

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 24.01.2008 10:17:25

gms hat geschrieben: ob damit die interaktive Fragen deines Programms beantwortet werden können, müßte man durch Tests herausfinden, besser man vermeidet diese.
z.B läßt sich die Passwortabfrage von ssh nicht auf diese Weise, die Passwortabfrage von passwd aber schon, beantworten:
Ansonsten benutzt "expect".. wenn man sich dran gewöhnt hat (ich habs vor Jahren mal benutzt) dann kann man damit fast alles machen..
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Antworten