Met bestandsnamen als deze:
/the/path/foo.txt
bar.txt
hoop ik te krijgen:
foo
bar
Waarom werkt dit niet?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Wat's de juiste manier om het te doen?
Je hoeft het externe basename
commando niet aan te roepen. In plaats daarvan zou u de volgende commando's kunnen gebruiken:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Merk op dat deze oplossing zou moeten werken in alle recente (post 2004) POSIX compliant shells, (b.v. bash
, dash
, ksh
, etc.).
Bron: Shell Command Language 2.6.2 Parameter Expansion
Meer over bash String Manipulaties: http://tldp.org/LDP/LG/issue18/bash.html
Het basename commando heeft twee verschillende invocaties; in de ene geef je alleen het pad op, in welk geval het je de laatste component geeft, terwijl je in de andere ook een achtervoegsel opgeeft dat het zal verwijderen. U kunt uw voorbeeldcode dus vereenvoudigen door de tweede aanroep van basename te gebruiken. Wees ook voorzichtig om dingen correct te citeren:
fbname=$(basename "$1" .txt) echo "$fbname"