• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

shellscript mag mein else nicht. --anfänger--

linOS

Member
hi

ich mache mir gerade ein script das mir meine backups erledigt. ich starte es mit den parametern der zu sichernden verzeichnisse (Documents/Homeoffice, Mail, .kde, bzw ohne für ~/ um die settings zu sichern). bis jetzt machen das zwei scripte, ich will aber nur noch eines das zudem von allen usern genutzt werden kann.

das sind so die ersten scripte die ich schreibe (macht echt spaß). so ganz komme ich mit dem schleifen noch nicht klar. mein fehler jetzt ist, das er das erste else (zeile 11 - else set name = $1-$datum)

set datum = $(date +"%d.%m.%Y")
set $dir_ziel = /mnt/backup/oingman/DarT/



## Archivnamen vergeben (name-datum)
if [ $1 == .kde ]; then
....set $name = KDE-$datum
elif [ $1 == "" ]
....set $name = HOME-$datum
else
....set $name = $1-$datum
fi

## Befehl konfigurieren
if [ $name == "HOME" ]; then
....$dar_c = dar \
........-c $dir_ziel/$name \
........-P Documents/Business/ \
........-P Documents/HomeOffice/ \
........-P Documents/Develop/ \
........-P Desktop/Trash \
........-P Mail/ \
........-P tmp/ \
........-P.kde/
else
........$dar_c dar -c $dir_ziel/$name
fi

## Ausführen
cd $HOME/$1
$dar_c
(punkte sind natürlich nicht drin =))


was ist da falsch?

und da das script noch nicht ausgeführt wird, habe ich bedenken was das

set $name = $1-$datum

angeht. wird das gehen? wie kann ich variablen ändern? mein problem war mal ein

set $1 = KDE
oder
$blala++ (hehe, phpgewöhnung)

ich habe in beiden fällen nicht hinbekommen, mein ziel, $1 umzuändern bzw ein increment hinzubekommen. also die syntax ist mir manchmal noch etwas uverständlich. ich lese zur zeit in selflinux.de eine deutsche anleitung, aber viel hilft sie mir leider auch nicht =(

okok, das waren viele fragen. aber es macht eben echt monster spaß und ein bischen probiert habe ich schon .. =)
 

hardy

Newbie
Hallo linOS,

Du schreibst noch php oder perl syntax.

In Shellscripten darfst Du bei der Zuweisung kein $-Zeichen verwenden und keine Leerzeichen vor und hinter dem =-Zeichen!

Also:

falsch :
$name = willi

richtig
name=willi

Gruß Hardy
 
OP
L

linOS

Member
*grmpf .. jepp .. bei den vorherigen zwei backupscripten mache ich es sogar richtig. umgewöhnung ...

aber ich bekomme immernoch die meldung
./bupc-usrhome.sh: line 11: syntax error near unexpected token `else'
./bupc-usrhome.sh: line 11: `else'

ein unerwartetes zeichen?? warum? darf ich else so nicht anwenden?
 
Moin linOS,

ich komme auch nur aus der PHP Fraktion, aber:
if [ $1 == .kde ]; then
....set $name = KDE-$datum
elif [ $1 == "" ]
....set $name = HOME-$datum
else
....set $name = $1-$datum
fi

sieht für mich danach aus, das Du das if mi fi zu spät zu machst. Das müßte doch vor dem else stehen?
 

oc2pus

Ultimate Guru
if [ $1 == .kde ]; then
....set $name = KDE-$datum
elif [ $1 == "" ]
....set $name = HOME-$datum
else
....set $name = $1-$datum
fi

nehmen wir einmal an $1 (der erste Paramter wäre "mein homeverzeichnis" (also ein blank drin), dann wird keiner deiner Vergleiche greifen ...
also besser if [ "$1" = ".kde" ]; then.

Ein Test auf einen leeren String erledigt man mit if [ -z $1 ]; then .. fi

Das letzte else soll der default sein? dann initialisiere die Variable name doch so: name="$1"-$datum" oder "$1"-`date`

wenn du in deinem Script am Anfang set -x hinzufügst, werden die die Befehle alle auf der Konsole angezeigt, das hilft beim debuggen ungemein ;)
 
OP
L

linOS

Member
@geier: ne, das ist so schon richtig. der fehler war nur das ich die variablen mit einem $ gekennzeichnet habe und das wird so nicht angenommen.

@oc2pus: das probiere ich gleich mal aus. weil ohne kamen wirklich nur fehler.

kann es sein das $1 geändert wird im laufe des scriptes? ich hatte mit $1 den "wert1" übergeben. obwohl ich daran nichts geändert hatte, war $1 in zeile 3 plötzlich dir_home (oder so, war gestern nacht). und noch später wieder was anderes. ist $1 also nicht nur der eingegebene parameter sondern auch die zuletzt verwendete variable??
 
OP
L

linOS

Member
kann ich in einem if mehrere eingaben prüfen? in php/shell mixed würde das so aussehen was aber nicht geht ;)

if [ "$1" == "kde" OR "$1" == "mail" ]; then ...
 

oc2pus

Ultimate Guru
linOS schrieb:
kann ich in einem if mehrere eingaben prüfen? in php/shell mixed würde das so aussehen was aber nicht geht ;)
if [ "$1" == "kde" OR "$1" == "mail" ]; then ...

if [ "$1" == ".kde" -o "$1" == "mail" ]; then .,,,

-a = and
 
OP
L

linOS

Member
ok, das ja easy ;) ..

eine frage zu den "set". ich übergebe parameter 1 nicht. als erstes im script werden zwei set ausgeführt. ich mache vor den sets ein echo $1 und danach. davor ist das die ausgabe leer, danach ist die ausgabe "datum", was der letzten variablen entspricht. ich kann auf set verzichten, sieht aber besser aus. warum ist das so? was genau ist $1 und $2 etc.? ich habe es bisher als parameter 1, 2, ... angenommen. ist es die letzte , vorletzten, drittletzte gesetzte variable, bzw die bezeichnung davon?

oder verstehe ich set falsch? weil ohne set bleibt $1 immer der wert der ersten option, egal wo im script ich es mir ausgeben lasse.
 

oc2pus

Ultimate Guru
$0 ist der scriptname mit Pfad
`basename $0` ist der scriptname OHNE Pfade

$1 ... $x sind die übergebenen Parameter an das script

diese ändern sich nicht, es sei denn du machst so einen "Blödsinn" wie $1="neuerWert" ;)

p.s.
poste doch mal dein Script in der aktuellen Form ;)
 
OP
L

linOS

Member
hmm .. ok, mein aktuelles script. komme aber gerade nicht weiter, muss mein neues bett aufbauen =)

set -x
#
## VARIABLEN SETZTEN
# Parameter1: User // Parameter2: Welche Backupvariante
#
bup_ziel=/mnt/backup/$1/DarT/
bup_datum=$(date +"%d.%m.%Y")

#
## TEST PARAMETER 1
# != PARAMETER 2
#
if [ "$1" == "kde" -o "$1" == "home" -o "$1" == "mail" -o "$1" == "office" -o "$1" == "business" -o "$1" == "dev" -o -z $1 ]; then
err_para1="Parameter 1 (user) wurde vergessen"
fi

#
## BACKUPVARIANTEN EINSTELLEN
#
if [ "$2" == "kde" ]; then
bup_quelle=/home/$1/.kde
elif [ "$2" == "home" ]; then
bup_quelle=/home/$1
elif [ "$2" == "mail" ]; then
bup_quelle=/home/$1/Mail
elif [ "$2" == "office" ]; then
bup_quelle=/home/$1/Documents/HomeOffice
elif [ "$2" == "business" ]; then
bup_quelle=/home/$1/Documents/Business
elif [ "$2" == "dev" ]; then
bup_quelle=/home/$1/Documents/Develop
else
err_varianten="Backupvariante wurde nicht gewählt"
fi

#
## BEFEHLE CONFIGURIEREN
#
if [ "$2" == "home" ]; then
dar_c=dar \
-c $bup_ziel \
-P Documents/Business \
-P Documents/HomeOffice \
-P Documents/Develop \
-P Desktop/Trash \
-P Mail \
-P tmp \
-P.kde
elif [ "$2" == "kde" ]; then
darc_c=dar \
-c $bup_ziel \
-P /.kde/share/config/session
else
dar_c=dar -c $bup_ziel
fi

#
## BEFEHL AUSFÜHREN
#
als nächstes mache ich noch eine funktion die das backup als befehl ausführt oder eben, wenn eine err_xxx vorliegt, den fehler ausgibt. danach möchte ich meine backupvarianten noch in ein array stecken und das auslesen, dann werden die if [ .. -o -o .. ] nocht so lang. wird eh das gleiche ausgeführt, meistens zumindest.

es soll mal vom root ausgeführt werden können und nicht vom benutzer. script soll so gestartet werden:
./bupc_usrhome.sh username backuptyp

dann mal das was mein $1 verändert:
echt $1
set bup_ziel = /mnt/backup/$user/DarT/
set bup_datum = $(date +"%d.%m.%Y")
echo $1
zuerst ist $1 das was ich übergebe (meistens zum testen nichts, ist ja noch nicht fertig (funktion)), als zweites wird als echo datum ausgegeben. daher auch aktuell ohne set.

hab schon mal was gelesen das manche sachen in älteren bashes (?) nicht funktionieren, oder schwirigkeiten machen. ist das sowas? ich habe v2.0

immer mehr fragen *gg: kann man eine -h option schreiben, ich möchte ausgeben lassen, welche optionen verlangt werden? nur mal so vorab und nebenbei ;-)
 

oc2pus

Ultimate Guru
if [ "$2" == "kde" ]; then
bup_quelle=/home/$1/.kde
elif [ "$2" == "home" ]; then
bup_quelle=/home/$1
elif [ "$2" == "mail" ]; then
bup_quelle=/home/$1/Mail
elif [ "$2" == "office" ]; then
bup_quelle=/home/$1/Documents/HomeOffice
elif [ "$2" == "business" ]; then
bup_quelle=/home/$1/Documents/Business
elif [ "$2" == "dev" ]; then
bup_quelle=/home/$1/Documents/Develop
else
err_varianten="Backupvariante wurde nicht gewählt"
fi

würde ich so schreiben

case "$2" in
"kde")
bup_quelle=/home/$1/.kde
;;
"home")
bup_quelle=/home/$1
;;
"mail")
bup_quelle=/home/$1/Mail
;;
...

*)
bup_quelle=""
err_varianten="Backupvariante wurde nicht gewählt"
;;
esac

diese Problem:
echt $1
set bup_ziel = /mnt/backup/$user/DarT/
set bup_datum = $(date +"%d.%m.%Y")
echo $1

die Zuweisungen OHNE <leerzeichen>!!!
bup_ziel=/mnt/backup/$user/DarT

die Option -h, zum Beispiel:
case "$1" in
-h)
echo "hilfetext"
exit 1
;;
-?)
echo "hilfetext"
exit 1
;;
--help)
echo "hilfetext"
exit 1
;;
*)
;;
esac
 
OP
L

linOS

Member
auch wenn ich
set var=xyz
schreibe und danach ein ech $1 mache, kommt die letzte varliable. hier die ausgaben von set-x der ersten zeilen:

test
++ set bup_ziel=/mnt/backup/test/DarT/
+++ date +%d.%m.%Y
++ set bup_datum=11.10.2004
++ echo bup_datum=11.10.2004
bup_datum=11.10.2004

das waren diese hier:
echo $1
set bup_ziel=/mnt/backup/$1/DarT/
set bup_datum=$(date +"%d.%m.%Y")
echo $1

übergeben war "test". und wie gesagt, ohne set geht es. und soweit ich das bisher sehen/lesen konnt, kann man bei set die leerzeichen machen, nur ohne nicht. geklappt hat es bisher immer, auser das geschilderte problem.
 

oc2pus

Ultimate Guru
das ist doch aber logisch ... das set setzt $1 etc neu ...

lies dir mal mit "man set" durch was du da treibst ;)

set - Without options, the name and value of each shell variable are displayed in a format that can be reused as input. The output is sorted according to the current locale. When options are specified, they set or unset shell attributes. Any arguments remaining after the options are processed are treated as values for the positional parameters and are assigned, in order, to $1, $2, ... $n.
 
OP
L

linOS

Member
oha, da gibts ja für alles ne manpage, wußte ich gar nicht. mein englisch ist zwar nicht das beste, aber es hilft immer wieder weiter. das muss man erstmal wissen, wäre da auch nie drauf gekommen weil set oder if etc für mich kein programm ist wie dar beispielsweise.

ps: das mit dem case werde ich übernehmen, so ist am ende auch geprüft ob die variable einen wert bekommen hat.
 
OP
L

linOS

Member
function dar_c () {
dar -c $bup_ziel/$2
}

als ergebnis kommt
dar -c /mnt/backup/oingman/DarT//

kann ich $2 nicht in einer funktion verwenden? wenn ich danach echo $2 mache kommt auch der parameter den ich eingegeben habe. verstehe ich jetzt nicht ganz.
 

oc2pus

Ultimate Guru
die Funktionen haben wieder die Parameter $1 .. $n

Beispiel:
#!/bin/bash
func()
{
echo "vorname=$1"
}

name=$1
vorname=$2
func $2

d.h. der übergebene Parameter wird zu $1 in der Funktion
 
OP
L

linOS

Member
achso.. habs gelöst. mein script geht. so kann ich es schon mal verwenden. ein paar deteils wie case baue ich noch ein. auserdem muss ich mich wohl noch näher mit dar beschäftigen.

das fertige will ich nicht vorenthalten:

#
## VARIABLEN SETZTEN
# Parameter1: User // Parameter2: Welche Backupvariante
#
bup_ziel=/mnt/backup/$1/DarT/
bup_datum=$(date +"%d.%m.%Y")
#
## TEST PARAMETER 1
# != PARAMETER 2
#
if [ "$1" == "kde" -o "$1" == "home" -o "$1" == "mail" -o "$1" == "office" -o "$1" == "business" -o "$1" == "dev" -o -z $1 ]; then
err_parameter1="Parameter 1 (user) wurde vergessen"
fi

#
## BACKUPVARIANTEN EINSTELLEN
#
if [ "$2" == "kde" ]; then
bup_quelle=/home/$1/.kde
elif [ "$2" == "home" ]; then
bup_quelle=/home/$1
elif [ "$2" == "mail" ]; then
bup_quelle=/home/$1/Mail
elif [ "$2" == "office" ]; then
bup_quelle=/home/$1/Documents/HomeOffice
elif [ "$2" == "business" ]; then
bup_quelle=/home/$1/Documents/Business
elif [ "$2" == "dev" ]; then
bup_quelle=/home/$1/Documents/Develop
else
err_varianten="Backupvariante wurde nicht gewählt bzw. der Parameter fehlt."
fi

#
## BEFEHLE CONFIGURIEREN
#
dar_ziel=$bup_ziel$2-$bup_datum
if [ "$2" == "home" ]; then
function dar_c () {
dar \
-c $dar_ziel \
-P Documents/Business \
-P Documents/HomeOffice \
-P Documents/Develop \
-P Desktop/Trash \
-P Mail \
-P tmp \
-P.kde
}
elif [ "$2" == "kde" ]; then
function dar_c () {
dar \
-c $dar_ziel \
-P share/config/session
}
else
function dar_c () {
dar -c $dar_ziel
}
fi

#
## BEFEHL AUSFÜHREN
#
if [ -z $err_parameter1 -a -z $err_varianten ]; then
cd $bup_quelle
dar_c
else
echo $err_parameter1 $err_varianten
fi
 

oc2pus

Ultimate Guru
schön ;)

else
err_varianten="Backupvariante wurde nicht gewählt bzw. der Parameter fehlt."
fi

in dem letzen else würde ich noch ein exit einbauen, sonst fängt der irgendwas an ..
 
Oben