Avec des noms de fichiers comme ceux-ci :
/the/path/foo.txt
bar.txt
J'espère obtenir :
foo
bar
Pourquoi cela ne fonctionne-t-il pas ?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
Quelle est la bonne façon de faire ?
Vous n'avez pas besoin d'appeler la commande externe basename
. Au lieu de cela, vous pouvez utiliser les commandes suivantes :
$ s=/the/path/foo.txt
$ echo ${s##*/}
foo.txt
$ s=${s##*/}
$ echo ${s%.txt}
foo
$ echo ${s%.*}
foo
Notez que cette solution devrait fonctionner dans tous les shells récents (après 2004) conformes à POSIX, (par exemple bash
, dash
, ksh
, etc.).
Source : Shell Command Language 2.6.2 Parameter Expansion
Plus d'informations sur les manipulations de chaînes de caractères en bash : http://tldp.org/LDP/LG/issue18/bash.html
La commande basename a deux invocations différentes ; dans l'une, vous spécifiez uniquement le chemin, auquel cas elle vous donne le dernier composant, tandis que dans l'autre vous donnez également un suffixe qu'elle supprimera. Vous pouvez donc simplifier le code de votre exemple en utilisant la deuxième invocation de basename. Faites également attention à citer correctement les choses :
fbname=$(basename "$1" ; .txt) echo "$fbname" ;