Der basename-Befehl hat zwei verschiedene Aufrufe; In einem geben Sie nur den Pfad an, in diesem Fall erhalten Sie die letzte Komponente, während Sie im anderen auch ein Suffix angeben, das entfernt wird. Sie können Ihren Beispielcode also vereinfachen, indem Sie den zweiten Aufruf von basename verwenden. Achten Sie auch darauf, Dinge korrekt zu zitieren:
fbname=$(basename "$1" .txt) echo "$fbname"
Hier sind Einzeiler:
05
14
Ich brauchte das, genau wie von bongbang und w4etwetewtwet gefragt.
Sie müssen die externe
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Beachten Sie, dass diese Lösung in allen neueren (nach 2004) funktionieren sollte ) POSIX konforme Shells, (z. B. 38
, 45
, 55
usw.).
Quelle:Shell Command Language 2.6.2 Parametererweiterung
Mehr über Bash-String-Manipulationen:http://tldp.org/LDP/LG/issue18/bash.html
Eine Kombination aus basename und cut funktioniert gut, auch im Falle einer doppelten Endung wie 62
:
fbname=$(basename "$fullfile" | cut -d. -f1)
Wäre interessant, wenn diese Lösung weniger Rechenleistung benötigt als Bash Parameter Expansion.