🛈 Aktuell gibt es im Wiki ca. 300 Artikel, die nur für Xenial getestet sind. Dies entspricht ca. 3,8 % aller Wikiartikel. Damit diese im Frühjahr nicht alle archiviert werden müssen, ist eure Mithilfe gefragt!
Mehrere Variablen zu einer Zusammenfassen
Status:
Gelöst
|
Ubuntu-Version:
Ubuntu 20.04 (Focal Fossa)
Antworten |
Daniel1206
Anmeldungsdatum: 9. Februar 2021
Beiträge: 6
|

15. Februar 2021 14:59
Hallo, ich versuche gerade ein Backup-Script zu schreiben, bei dem ich die User in der Variable $me definiere. Ich möchte die User gerne aus der Kommandozeile importieren: | backup.sh user1 user2 user3 user4 user5
|
Werden keine user angegeben soll die Variable $me mit $USER gefüllt werden. Hat jemand eine Idee wie ich das hinbekomme? Ich habe es mit
| echo $? 2>&1
if [ $? -eq 0 ] ;
then
me="${?}"
else
me="${USER}"
fi
|
versucht
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 23
|

15. Februar 2021 15:44
(zuletzt bearbeitet: 15. Februar 2021 15:45)
Die übergebenen Parameter stehen in den Spezialvariablen $1, $2, $3,... oder gesammelt in $* bzw. $@. Die Anzahl der Parameter stehen in $#. Die kannst Du direkt abfragen mit: | if [ $# -eq 0 ] ; then
me="${USER}"
else
# nutze die Variablen $1, $2, $3 ...
fi
|
Genauer Erklärungen dieser und anderer Spezialvariablen siehe hier: http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_005_002.htm#RxxKap00500204004DE91F045174 Das $?, dass Du verwendest ist etwas anderes. Das funktioniert so nicht.
|
Daniel1206
(Themenstarter)
Anmeldungsdatum: 9. Februar 2021
Beiträge: 6
|

15. Februar 2021 16:25
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17029
Wohnort: Berlin
|

15. Februar 2021 16:32
Alternative Lösung: | #!/bin/bash
for user
do
echo ${user}
done
test -z ${user} && echo ${USER}
|
Dieses Konstrukt "for user" funktioniert für jeden gültigen Bezeichner anstelle von user. Eine solche for-Schleife arbeitet alle Kommandozeilenargumente der Reihe nach ab. Statt echo würdest Du backupFor oder sowas aufrufen. Das test -z testet auf Leere. Ist $user leer, dann rufst Du backupFor $USER auf.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 11373
|

15. Februar 2021 18:03
(zuletzt bearbeitet: 15. Februar 2021 18:03)
Mein Vorschlag: immer die for -Schleife nutzen und falls keine Namen auf der Kommandozeile angegeben wurden, diese modifizieren | #!/bin/sh
[ $# -gt 0 ] || set -- $USER
for u; do
backup $u
done
|
Das vermeidet die Redundanz mit den zwei Aufrufen von echo (bzw. "backup").
|
fork991
Anmeldungsdatum: 26. Mai 2010
Beiträge: 23
|

15. Februar 2021 18:07
(zuletzt bearbeitet: 15. Februar 2021 18:09)
Um die Vorschläge hier umsetzen zu können ist es vielleicht praktisch gleich nochmal das Thema Funktionen durchzulesen: Funktionen http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_008_000.htm#Xxx999276 Etwas weniger ausführlich ist das Thema Shellprogrammierung auf Self-Linux beschrieben: https://www.selflinux.org/selflinux/html/shellprogrammierung.html
|
Daniel1206
(Themenstarter)
Anmeldungsdatum: 9. Februar 2021
Beiträge: 6
|

15. Februar 2021 19:45
Also bisher sieht mein Script so aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 | #!/bin/bash
#Angemeldeter User = übergebender User FALSCH!!!
if [ $# -eq 0 ] ; then
me="${USER}"
else
me="${#}"
fi
#Check ob User existiert
datei='/etc/passwd'
cat $datei | grep "${me}:" >/dev/null 2>&1
if [ $? -eq 0 ] ;
then
echo "Benutzer existiert"
else
echo "Benutzer nicht gefunden"
fi
#Homedir als Variable speichern
cat $datei | grep "${me}:" >/dev/null 2>&1
if [ $? -eq 0 ] ;
then
cat /etc/passwd | grep "${me}:" | cut -d : -f 6
else
echo "Verzeichnis nicht gefunden"
fi
homedir=$(cat /etc/passwd | grep "${me}:" | cut -d : -f 6)
#Check ob Benutzer Homeverzeichnis hat & Script-Abbruch
cat /etc/passwd | grep ${me} >/dev/null 2>&1
if [ $? -eq 0 ] ;
then
tar -zcvf "/var/backups/users/${me}_home_$(date '+%Y%m%d').tar.gz" $homedir
else
echo "Benutzer hat kein Homeverzeichnis! Backup wurde nicht angelegt."
fi
exit 0
|
Wenn ich also 3 Usernamen in der Kommandozeile eingebe muss das Script 3x laufen- einmal per Username, aber wie bekomme ich das hin? :/ Danke für die vielen Tipps ☺
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 9640
Wohnort: München
|

16. Februar 2021 00:20
Daniel1206 schrieb: Wenn ich also 3 Usernamen in der Kommandozeile eingebe muss das Script 3x laufen- einmal per Username, aber wie bekomme ich das hin?
Du machst eine for-Schleife über die Argumente - also z.B.:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | #!/usr/bin/bash
[ $# -eq 0 ] && set -- "$USER" # wenn keine Argumente übergeben wurden, setze $USER als Argument
# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
for user
do
if id "$user" 2>&1
then
home=$(getent passwd "$user" | cut -d ':' -f 6)
if [ -z "$home" ]
then
echo "Benutzer hat kein Homeverzeichnis! Backup wird nicht angelegt." >&2
continue
fi
tar -zcvf "/var/backups/users/${user}_home_$(date '+%Y%m%d').tar.gz" "$home"
else
echo "Benutzer nicht gefunden" >&2
fi
done
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 11373
|

16. Februar 2021 23:06
Daniel1206 schrieb: Also bisher sieht mein Script so aus:
[...]
In dem Skript sind einige Umständlichkeiten und Fehler. Ich bin gerade etwas müde, deshalb nur der offensichtlichste: in Zeile 21ff speicherst Du das Home nicht in einer Variable - das kommt erst in 30. Das andere Problem, das ich sehe, ist, dass das Skript entweder unter "root" laufen muss oder Du die Rechte aller Homeverzeichnisse, die irgendwann mal gesichert werden sollen, so ändern musst, dass ein Benutzer darauf zugreifen kann, der nicht "root" ist.
|