staging.inyokaproject.org

Mehrere Variablen zu einer Zusammenfassen

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

Daniel1206

Anmeldungsdatum:
9. Februar 2021

Beiträge: 6

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:

1
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

1
2
3
4
5
6
7
echo $? 2>&1
if [ $? -eq 0 ] ; 
then
    me="${?}"
else
    me="${USER}"
fi

versucht

fork991

Anmeldungsdatum:
26. Mai 2010

Beiträge: 58

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:

1
2
3
4
5
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

Vielen Dank ☺

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Alternative Lösung:

1
2
3
4
5
6
#!/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 Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Mein Vorschlag: immer die for-Schleife nutzen und falls keine Namen auf der Kommandozeile angegeben wurden, diese modifizieren

1
2
3
4
5
6
7
#!/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: 58

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

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: 11278

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 Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

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.

Antworten |