ubuntuusers.de

Stringfunktionen - Beispiel aus einem Buch

Status: Gelöst | Ubuntu-Version: Kubuntu 11.10 (Oneiric Ocelot)
Antworten |

newbie

Anmeldungsdatum:
23. März 2006

Beiträge: 965

Hi,

ich kann leider ein Beispiel aus einem Buch nicht ausführen, weil ich bei der Ausführung Fehlermeldung erhalte:

1
2
3
./acut: Zeile 4: ${var2 %/*}: Falsche Variablenersetzung.
./acut: Zeile 10: ${var1 %??}: Falsche Variablenersetzung.
./acut: Zeile 14: ${var2 %/kapitel2.txt}: Falsche Variablenersetzung.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

# Name : acut
var1="1234567890"
var2="/home/you/Dokuments/shell/kapitel2.txt"
pfad=${var2 %/*}


file=${var2##*/}
echo "Komplette Angabe: $var2"
echo "Pfad : $pfad"
echo "Datei : $file"
# rechts 2 Zeichen abschneiden
echo ${var1 %??}
# links 2 Zeichen abschneiden
echo ${var1#??}
# im Klartext ohne Metazeichen
echo ${var2 %/kapitel2.txt}

Ausgabe sollte eigentlich so aussehen:

1
2
3
4
5
6
7
you@host > ./acut
Komplette Angabe: /home/you/Dokuments/shell/kapitel2.txt
Pfad : /home/you/Dokuments/shell
Datei : kapitel2.txt
12345678
34567890
/home/you/Dokuments/shell

Warum bekomme ich diese Fehlermeldung und kann mir jemand bitte erklären was dieses Beispiel genau macht?

Danke!

busfahrer

Avatar von busfahrer

Anmeldungsdatum:
9. April 2007

Beiträge: 3052

Hallo

versuch es bei pfad mal so

1
pfad=${var2%/*}

Gruß...busfahrer

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

newbie schrieb:

Hi,

ich kann leider ein Beispiel aus einem Buch nicht ausführen, weil ich bei der Ausführung Fehlermeldung erhalte:

Tja - es wäre hilfreich, Du schreibst dazu, um welche Sprache es überhaupt geht.

Bash-scripting?

newbie

(Themenstarter)

Anmeldungsdatum:
23. März 2006

Beiträge: 965

busfahrer schrieb:

Hallo

versuch es bei pfad mal so

1
pfad=${var2%/*}

Gruß...busfahrer

Super, das war der Fehler! Seltsam, dass im Buch ein Leerzeichen dazwischen ist.

@user unknown, Jap. Das Beispiel ist aus dem Buch Shell-Programmierung von Galileo.

Man findet dieses Beispiel auch hier: http://linuxint.com/DOCS/Linux_Docs/openbook_shell/shell_004_002.htm Ich habe die Erklärung von diesen Stringfunktionen leider nicht verstanden und verstehe deshalb dieses Beispiel nicht. Könnte mir bitte jemand erklären, welche Aufgaben diese Funktionen in diesem Script haben bzw. diese erklären(anders als im Buch steht)?

Danke!

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Alternativerklärung:

http://mywiki.wooledge.org/BashFAQ/073

Du schneidest mit diesen Dingern von den Variablen einen Teil ab, entweder den größten (## bzw. %%) oder kleinsten (# bzw. %) passenden Teil und entweder von links (# und ##) oder von rechts (% und %%) startend. Die Originalvariable bleibt aber unverändert.

newbie

(Themenstarter)

Anmeldungsdatum:
23. März 2006

Beiträge: 965

Vielen Dank für deine Antwort. Ich habe es fast verstanden ☺.

Folgendermaßen habe ich das jetzt verstanden(bei Fehlern bitte korrigieren!)

pfad=${var2%/*}

Ich suche von rechts nach links nach folgendem Muster "/*" (* steht für beliebigen String) in diesem Array: "/home/you/Dokuments/shell/kapitel2.txt". Sobald das Muster gefunden wurde, wird der ganze String in zwei Teilstrings geteilt: "/home/you/Dokuments/shell" und /kapitel2.txt. Da der String "/kapitel2.txt" kleiner ist als "/home/you/Dokuments/shell", wird "/kapitel2.txt" abgeschnitten.

1
2
3
4
${var#pattern} suche von links nach rechts und schneide den kleinsten Teilstring ab
${var##pattern} suche von links nach rechts und schneide den größten Teilstring ab
${var%pattern} suche von rechts nach links und schneide den kleinsten Teilstring ab
${var%%pattern} suche von rechts nach links und schneide den größten Teilstring ab

Habe ich das jetzt alles richtig verstanden bzw. aufgeschrieben?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Ja, fast. ☺

Okay, dein Ausgangsstring ist „/home/you/Dokuments/shell/kapitel2.txt“. Das eine „%“ sagt jetzt aus, dass von rechts her gesucht werden soll – so weit hast du das richtig verstanden. Aber dann heißt das eine Prozentzeichen (es könnte ja auch „%%“ sein, also „${var2%%/*}“), dass der kleinstmögliche Treffer genommen werden soll. Das heißt bei dir, dass dein Treffer das „/kapitel2.txt“ ist. Wäre es aber „%%“, so würde der größtmögliche Treffer genommen werden, was dem kompletten String entspräche: „/home/you...“ entspricht ja dem Muster „/*“, der Slash vor dem Stern ist dann der Slash vor dem „home“.

Jetzt haben wir also den Ausgangsstring und einen Treffer. Der Treffer wird nun einfach weggelassen und der Rest „zurückgegeben“.

Das „groß“ und „klein“ bezieht sich nur auf die Auswahl des Treffers innerhalb deines Strings und entscheidet nicht darüber, was weggelassen wird.

Zum Verständnis ist vielleicht wirklich das erste Beispiel aus dem Wiki besser, da hier keine leeren Strings als Ergebnis auftauchen:

parameter     result
-----------   ------------------------------
${NAME}       polish.ostrich.racing.champion
${NAME#*.}           ostrich.racing.champion
${NAME##*.}                         champion
${NAME%%.*}   polish
${NAME%.*}    polish.ostrich.racing

newbie

(Themenstarter)

Anmeldungsdatum:
23. März 2006

Beiträge: 965

Vielen Dank für deine Hilfe! Jetzt habe ich das verstanden. 👍

Antworten |