staging.inyokaproject.org

Letztes Zeichen einer Stringvariablen ermitteln und ein Zeichen anhängen

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

Bill_Keggan

Avatar von Bill_Keggan

Anmeldungsdatum:
16. Juni 2016

Beiträge: Zähle...

Hallo zusammen,

ich bin recht neu in der Shellprogrammierung und habe eine Frage:

Beim Aufruf eines Scripts werden der Dateiname ($1) zwingend und eine Pfadangabe ($2) optional von der Tastatur übergeben. Ich möchte nun prüfen, ob das letzte Zeichen in der Pfadangabe $2 ein "/" ist und wenn nicht diesen anhängen. Wie mache ich das?

Im Voraus schon mal besten Dank!

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

1
2
# Wenn das letzte Zeichen kein Slash ist, wird er ergänzt, und in der Variable VERZEICHNIS gespeichert.
[ "${2: -1}" != "/" ]  && VERZEICHNIS="${2}/" || VERZEICHNIS=$2

Siehe auch.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Hi Bill_Keggan,

erstmal herzlich willkommen hier auf dem Forum !

In Deinem Fall würde ich das prüfen und ggf. anhängen direkt in einem Schritt machen, mit einer Parameter Expansion,
konkreter: direkt mit einer Ersetzung des letzten Zeichens:

track@track:~$ p=dies/und/das/
track@track:~$ s=xyz
track@track:~$ echo "${p/%\///$s}"
dies/und/das/xyz
track@track:~$ p=dies/und/das/abc
track@track:~$ echo "${p/%\///$s}"
dies/und/das/abc 

Das "%" als Anker für das Ende ist zwar etwas untypisch, steht aber so im Bash Manual.
Und dass man an dieser Stelle Variablen auch verschachteln kann siehst Du an meinem Beispiel ...

Edit: - ach so, Du wolltest ja genau umgekehrt haben, ggf. einen überflüssigen "/" weglöschen und dann den Pfad zusammensetzen:

track@track:~$ p=dies/und/das/
track@track:~$ d=meine
track@track:~$ echo "${p/%\//}/$d"
dies/und/das/meine
track@track:~$ p=dies/und/das
track@track:~$ echo "${p/%\//}/$d"
dies/und/das/meine 

Natürlich geht das genau so auch mit den Variablen $1 und $2 ...

LG,

track

Bill_Keggan

(Themenstarter)
Avatar von Bill_Keggan

Anmeldungsdatum:
16. Juni 2016

Beiträge: Zähle...

Besten Dank für die schnellen Antworten! Die Lösung mittels Test-Kommando von misterunknown gefällt mir persönlich besser, da sie für mich als Einsteiger besser verständlich ist. Ein ähnliches Konstrukt nutze ich schon zum Prüfen auf einen Leerstring beim Dateinamen. Wie man sieht führen viele Wege nach Rom, und ich werde mich auch noch mit der Lösung von track auseinandersetzen, man lernt ja nie aus...

LG Bill_Keggan

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Ich würde mir das Prüfen schenken, denn 2 Slashes hintereinander schaden nicht.

Bill_Keggan

(Themenstarter)
Avatar von Bill_Keggan

Anmeldungsdatum:
16. Juni 2016

Beiträge: 3

@user_unknown: So ist es aber sauber und der Lerneffekt für mich höher! 😉 Außerdem muss ich vor dem Anhängen von "/" noch prüfen, ob $2 leer ist, was ja durchaus sein kann. Dann wäre es doof, an den leeren String ein "/" anzuhängen. Die Datei würde dann immer im root (/) gespeichert werden...

Dir auch nochmal danke für die Unterstützung!

LG Bill_Keggan

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Bill_Keggan schrieb:

@user_unknown: So ist es aber sauber und der Lerneffekt für mich höher! 😉

Jetzt hast Du noch mehr gelernt, also ist der Lerneffekt noch höher. ☺

Außerdem muss ich vor dem Anhängen von "/" noch prüfen, ob $2 leer ist, was ja durchaus sein kann. Dann wäre es doof, an den leeren String ein "/" anzuhängen. Die Datei würde dann immer im root (/) gespeichert werden...

Arbeitest Du immer mit sudo?

Dir auch nochmal danke für die Unterstützung!

Gerne.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Es stimmt: wenn Du abfragst, ob das letzte Zeichen "alles, nur kein '/' ist", brauchst Du nur 1 Abfrage:

track@track:~$ pfad=a/b/c
track@track:~$ if [[ $pfad =~ [^/]$ ]] ; then pfad="$pfad/"; fi
track@track:~$ echo "$pfad"
a/b/c/ 

Du kannst hinterher den (ggf. auch leeren) Pfad und den Dateinamen direkt zusammensetzen und bist fertig.

Bei der Parameter Expansion kannst Du ggf. den doppelten "//" in Kauf nehmen. Dann wird es einfach:
(es gibt da eine hübsche Expansion, wo die Unterscheidung mit drin ist)

track@track:~$ unset pfad
track@track:~$ datei=xyz
track@track:~$ echo "${pfad:+$pfad/}$datei"
xyz
track@track:~$ pfad=a/b/c
track@track:~$ echo "${pfad:+$pfad/}$datei"
a/b/c/xyz
track@track:~$ pfad=a/b/c/
track@track:~$ echo "${pfad:+$pfad/}$datei"
a/b/c//xyz 

Oder Du bestehst auf der Schönheit der Arbeit, dann brauchst Du für die beiden Unterscheidungen je eine Expansion.
Die kannst Du aber ineinander schachteln:

track@track:~$ unset pfad
track@track:~$ datei=xyz
track@track:~$ echo "${pfad:+${$pfad/%\/}/}$datei"
xyz
track@track:~$ pfad=a/b/c
track@track:~$ echo "${pfad:+${$pfad/%\/}/}$datei"
a/b/c/xyz
track@track:~$ pfad=a/b/c/
track@track:~$ echo "${pfad:+${$pfad/%\/}/}$datei"
a/b/c/xyz 

LG,

track

Antworten |