Gitt filnavn som disse:
/the/path/foo.txt
bar.txt
håper jeg å få:
foo
bar
Hvorfor fungerer ikke dette?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Hva er den riktige måten å gjøre det på?
Du trenger ikke å bruke den eksterne kommandoen basename
. I stedet kan du bruke følgende kommandoer:
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Merk at denne løsningen bør fungere i alle nyere (etter 2004) POSIX-kompatible shells, (f.eks. bash
, dash
, ksh
, etc.).
Kilde: Shell Command Language 2.6.2 Parameter Expansion.
Mer om bash strengmanipulasjoner: http://tldp.org/LDP/LG/issue18/bash.html
Kommandoen basename har to forskjellige påkallinger; i den ene spesifiserer du bare banen, i hvilket tilfelle den gir deg den siste komponenten, mens i den andre gir du også et suffiks som den vil fjerne. Så du kan forenkle eksempelkoden din ved å bruke den andre påkallingen av basename. Vær også forsiktig med å sitere ting riktig:
fbname=$(basename "$1" .txt) echo "$fbname"