ubuntuusers.de

Bak per rsync / Syntaxklärung

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

pacmexx

Anmeldungsdatum:
11. Februar 2019

Beiträge: 56

Hallo, ich beschäftige mich gerade mit der Umsetzung des Scripts "Backup per rsync", hier auf dem Ubuntu-Wiki.

https://wiki.ubuntuusers.de/Skripte/Backup_mit_RSYNC/#Das-Skript

Ich bin noch bei dem Verständnis der Logik und komme soweit klar bis auf eine Stelle, wie interpretiere ich folgende IF-Abfrage, worauf wird da getestet? (Zeile 27-34)

1
2
3
4
5
6
TARGET="/media/backup"
LAST="last"; INC="--link-dest=$TARGET/$LAST"

if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
   TARGET=$TARGET/
fi

Gruß pac

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

pacmexx schrieb:

Hallo, ich beschäftige mich gerade mit der Umsetzung des Scripts "Backup per rsync", hier auf dem Ubuntu-Wiki.

https://wiki.ubuntuusers.de/Skripte/Backup_mit_RSYNC/#Das-Skript

Oh je. Ich mag das Skript nicht besonders, weil es z.B. mit solchen nützlichen Konventionen bricht, lokale Variablen klein zu schreiben. Dann werden alle Programmpfade in Variablen gespeichert, was das Skript erheblich komplizierter macht. Außerdem kommt es mir zu lang vor, aber das ist natürlich ziemlich unkonkrete Kritik.

Ich bin noch bei dem Verständnis der Logik und komme soweit klar bis auf eine Stelle, wie interpretiere ich folgende IF-Abfrage, worauf wird da getestet? (Zeile 27-34)

1
2
3
4
5
6
TARGET="/media/backup"
LAST="last"; INC="--link-dest=$TARGET/$LAST"

if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
   TARGET=$TARGET/
fi

Da wird geschaut, ob $TARGET mit einem Slash endet und, falls nicht, wird einer angehängt. Das ist aber überflüssig: man kann einfach immer einen anhängen. Wenn, hätte ich die Abfrage so gemacht:

1
2
3
4
5
6
7
[ -z "${TARGET##*/}" ] || TARGET="$TARGET/"

# oder

if [ -n "${TARGET##*/}" ]; then
  TARGET="$TARGET/"
fi

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3790

Was im Endeffekt passiert, hat rklm ja schon beschrieben. Meine laienhafte Detail-Erklärung der Parameter Expansion

${parameter:offset:length} 
  • Es wird die Zeichenanzahl von $TARGET ermittelt (hier: 13) per

    if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
  • Dann wird davon 1 abgezogen per

    if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
  • Danach ermittelt man das letzte Zeichen, indem man 1 Zeichen weitergeht:

    if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
  • Ist es ungleich "/"

    if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then

    wird es hinten ergänzt

    TARGET=$TARGET/

Siehe auch https://stackoverflow.com/questions/30197247/using-11-in-bash

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Eine andere Möglichkeit ist noch

1
2
3
4
case "$TARGET" in
*/) ;; # NOP
*) TARGET="$TARGET/";;
esac

pacmexx

(Themenstarter)

Anmeldungsdatum:
11. Februar 2019

Beiträge: 56

dingsbums schrieb:

Was im Endeffekt passiert, hat rklm ja schon beschrieben. Meine laienhafte Detail-Erklärung der Parameter Expansion

Danke, das war schonmal erhellend (wenn man es weiss, ist es ja ganz einfach ☺)

Ich komme auf das Script hier nochmal zurück, aktuell habe ich vorgelagerte Baustellen. Kann ich den Threat hier schliessen und bei Zeiten wieder eröffnen oder jedesmal einen neuen erstellen?

Danke+Gruß pac

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

pacmexx schrieb:

Danke, das war schonmal erhellend (wenn man es weiss, ist es ja ganz einfach ☺)

Kann ich den Threat hier schliessen und bei Zeiten wieder eröffnen oder jedesmal einen neuen erstellen?

Wenn Deine aktuelle Frage beantwortet ist, dann solltest Du als "gelöst" markieren. Für ein neues Problem machst Du dann ein neues Thema auf. Wenn das nötig oder sinnvoll ist, kannst Du ja auf dieses hier verweisen, indem Du z.B. [topic:bak-per-rsync-syntaxklaerung:Bak per rsync / Syntaxklärung] in den Text aufnimmst.

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6510

Wohnort: Hamburg

Da wird geschaut, ob $TARGET mit einem Slash endet und, falls nicht, wird einer angehängt. Das ist aber überflüssig: man kann einfach immer einen anhängen.

Im Prinzip ist das richtig. Aber im Umgang mit rsync muss man aufpassen ob dann wirklich das passiert, was man will.

Aus der man page:

...
       A  trailing slash on the source changes this behavior to avoid creating
       an additional directory level at the destination. 
...

Ich bin da schon mal reingefallen, weil ohne "/" nicht das passierte, was ich wollte.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Dakuan schrieb:

Im Prinzip ist das richtig. Aber im Umgang mit rsync muss man aufpassen ob dann wirklich das passiert, was man will.

Aus der man page:

...
       A  trailing slash on the source changes this behavior to avoid creating
       an additional directory level at the destination. 
...

Ich bin da schon mal reingefallen, weil ohne "/" nicht das passierte, was ich wollte.

Ja, aber es ging ja um die Alternative ein Slash oder zwei Slashes (und nicht, wie im Zitat null oder einen). Und da macht es keinen Unterschied.

Antworten |