#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
Existe-t-il de toute façon de coller ces deux lignes ensemble dans une doublure?
bash
shell
shell-script
string
gsklee
la source
la source
sed
elles seront définitivement nécessaires, je suppose.Vous ne pouvez pas imbriquer d'extensions dans bash (ni dans ksh, ash et autres coquilles en dehors de zsh). Il ne s'agit que d'une limitation esthétique, car, comme vous l'illustrez, vous pouvez affecter une expression intermédiaire à une variable temporaire. C'est un peu ennuyeux pour les monolignes, mais dans les scripts, c'est sans doute meilleur pour la lisibilité.
Vous pouvez éviter d'utiliser l'utilitaire externe
basename
et utiliser une construction de manipulation de chaîne à la place:Ici, il arrive que vous puissiez réécrire votre script pour mettre la substitution de commandes à l'extérieur . Ce n'est pas un phénomène général, et vous ne gagnez rien d'autre qu'un certain sentiment de doublure.
Zsh, pour le meilleur ou pour le pire, vous permet d'imbriquer des extensions:
Ou vous pouvez utiliser la construction intégrée de zsh au lieu de
basename
:la source
J'irais pour:
Le deuxième paramètre de basename est un suffixe à supprimer du nom de fichier (voir
man basename
)la source
Vous pouvez utiliser une seule
sed
commande comme dans l'exemple suivant:la source
L'intégration
sed
, cela devrait faire l'affaire:(Cela ne répond pas exactement à votre question parce que je ne peux pas; je ne sais pas si c'est possible.)
la source
Les
${}
constructions Bash fonctionnent avec des noms de variables , il n'y a donc aucun moyen d'incorporer une commande directement. L'approche de @ sr_ est une alternative si cela ne vous dérange pas le fork supplémentaire.la source
La ligne
peut être raccourci et rendu plus portable avec
la source