12
votes

Comment obtenir l'extension d'un fichier dans le script shell

J'essaie d'obtenir une extension de fichier pour un fichier dans le script shell. Mais sans de la chance.

La commande que j'utilise est xxx

et xxx

mais les deux des commandes Impossible de mettre de la valeur dans la variable fichier_ext. Mais quand j'essaie xxx

Cela me donne le résultat souhaité. Je suis nouveau dans le script shell. Veuillez décrire la situation ce qui se passe. Et aussi comment dois-je le faire?

Merci.


2 commentaires

Pour plus de références, tldp.org/ldp/abs/html est un très bon endroit!


Je me demande pourquoi le premier style fonctionne. Pourriez-vous s'il vous plaît expliquer?


3 Réponses :


3
votes

Vous devez faire attention lorsque vous déclarez des variables.

variable1="string"    # assign a string value
variable3=`command`   # assign output from command
variable2=$(command)  # assign output from command


1 commentaires

Merci bien interprété. :). J'ai eu ton point ne fera jamais cette erreur.



12
votes

Les espaces font mal.

De toute façon, vous devriez faire: P>

file_ext=$(echo $filename |awk -F . '{if (NF>1) {print $NF}}')


1 commentaires

Oui. L'idée était à la commande en $ (). Merci pour votre réponse.



23
votes

Pour obtenir une extension de fichier, utilisez simplement la coque

$ filename="myfile.ext"
$ echo ${filename##*.}
ext
$ file_ext=${filename##*.} #put to variable
$ echo ${file_ext}
ext


4 commentaires

Ouais mais pourquoi cela fonctionne-t-il? Quel est ce ## *. vaudou?


lol @ okonomiyaki3000, Bash Scripting est surtout vaudou pour moi XD. Cela fonctionne car {var ## quelquepattern} est un paramètre. ## PiedPattern supprime essentiellement le motif du Var, de sorte que tout retire jusqu'au point. Le seul gotcha avec c'est que si le motif n'est pas trouvé, toute la chaîne est renvoyée (qui peut être souhaitable ou non, dans mon cas, je voulais renvoyer une chaîne vide lorsqu'aucune extension n'existe). Voici un bon article sur la substitution des paramètres: Cyberciti.biz/tips/ Bash-shell-paramètre-substitution-2.html


Merci! Je n'ai jamais su cette fonctionnalité utile!


Il suffit de vérifier cela fonctionne également lorsque le nom de fichier contient plusieurs points. Par exemple. FileName = "myfile.log.gz" retournera gz , comme prévu.