ubuntuusers.de

bash basename funktioniert nicht?

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

-Jonathan

Anmeldungsdatum:
4. Juli 2012

Beiträge: 167

Ich hab jetzt sehr viele code snippets aus Foren ausprobiert, aber ich krieg nicht das gewünschte Resultat. Ich will den Namen der .sam files in einem directory ohne das .sam ausgeben. Warum funktioniert dieser code nicht?:

1
2
3
4
5
6
FILES=*.sam
for f in $FILES
do
	f=$(basename $f)
	echo "$f"
done

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Wenn du ein Suffix entfernen willst, musst du es angeben, sonst entfernt basename nur den Pfad:

1
f=$(basename $f .sam)

-Jonathan

(Themenstarter)

Anmeldungsdatum:
4. Juli 2012

Beiträge: 167

ahhh okay, merci ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Du solltest hier unbedingt den Umweg über die Variable vermeiden, denn diese "Lösung" platzt schon beim ersten Leerzeichen im Dateinamen !

Nimm die File Expansion direkt und "quote" sauber, und alles ist schön:

for f in *.sam
do
	f=$(basename "$f" .sam)
	echo "$f"
done

LG,

track

kletterhortensie

Anmeldungsdatum:
9. Januar 2014

Beiträge: Zähle...

Noch saubrer kann man so quoten:

f="$(basename "$f" .sam)"

Wir haben nach der Command Substitution (dem ersetzen von $(...) durch die Ausgabe von ...) noch Word Splitting und Pathname Expansion vor uns. Die Leerzeichen können uns auch danach noch Probleme machen!

Liebe Grüße

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

kletterhortensie schrieb:

Noch saubrer kann man so quoten:

f="$(basename "$f" .sam)"

Irrtum, das ist nun wirklich eine "urban legend" ... (allerdings äußert sich das Bash Manual hier etwas vage ...)

Guckstu:

track@lucid:~$ f=$(echo -e "\n123\t456\n789")
track@lucid:~$ echo "$f"

123	456
789
track@lucid:~$ f=$(echo -e "*.awk")
track@lucid:~$ echo "$f"
*.awk
track@lucid:~$ echo $f
olymp.awk toc2.awk toc.awk 

LG,

track

kletterhortensie

Anmeldungsdatum:
9. Januar 2014

Beiträge: 7

Wir liegen beide falsch… (edit: falls das nicht klar ist: track hat recht mit seiner Behauptung (aber er liefert die falsche Begründung) und ich hab unrecht (mit der gleichen unpassenden Begründung)

Aus deinem Link:

If the substitution appears within double quotes, word splitting and filename expansion are not performed on the results.

Das "if …" wär unsinnig, wenn es immer gölte.

Weiter oben:

The order of expansions is: brace expansion, tilde expansion, parameter, variable, and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and filename expansion.

Du hast dich von mir irreführen lassen ☺ Ich hätte recht, wenn die Sache nicht rechts von nem = stünde, ebd.:

A variable may be assigned to by a statement of the form

     name=[value]

If value is not given, the variable is assigned the null string. All values undergo tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal (see EXPANSION below).

Die Quotingregeln der Bash sind für mich einfach zu subtil ☺

Vielen Dank @track

Antworten |