Quel est le problème avec le code suivant?
name='$filename | cut -f1 -d'.''
Tel quel, j'obtiens la chaîne littérale $filename | cut -f1 -d'.'
, mais si je supprime les guillemets, je n'obtiens rien. Pendant ce temps, en tapant
"test.exe" | cut -f1 -d'.'
dans une coquille me donne la sortie que je veux, test
. Je sais déjà qu'on lui $filename
a attribué la bonne valeur. Ce que je veux faire, c'est attribuer à une variable le nom de fichier sans l'extension.
basename $filename .exe
ferait la même chose. Cela suppose que vous sachiez toujours quelle extension vous souhaitez supprimer.basename "$filename" .exe
. Sinon, les noms de fichiers avec des espaces seraient de mauvaises nouvelles.Réponses:
Vous devez utiliser la syntaxe de substitution de commande
$(command)
lorsque vous souhaitez exécuter une commande dans script / commande.Donc votre ligne serait
Explication du code:
echo
obtenir la valeur de la variable$filename
et l'envoyer à la sortie standardcut
commandecut
utilisera le. comme délimiteur (également connu sous le nom de séparateur) pour couper la chaîne en segments et en-f
sélectionnant le segment que nous voulons avoir en sortie$()
substitution de commande obtiendra la sortie et retournera sa valeurname
Notez que cela donne la partie de la variable jusqu'à la première période
.
:la source
echo $filename | cut -f1 -d'.'
$()
c'est préférable.Vous pouvez également utiliser l'expansion des paramètres:
la source
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
. Merci.image.png.gz
?%.*
supprimera uniquement la dernière extension; si vous souhaitez supprimer toutes les extensions, utilisez%%.*
.Si vous connaissez l'extension, vous pouvez utiliser basename
la source
.wiki
et finir avec/home/jsmith/base
?Si votre nom de fichier contient un point (autre que celui de l'extension), utilisez ceci:
la source
-s
option donnée àcut
, de sorte qu'elle renvoie une chaîne vide chaque fois que le nom de fichier ne contient pas de point.utilisez ce que vous voulez. Ici, je suppose que le dernier
.
(point) suivi du texte est l'extension.la source
les sorties:
Notez que seule la dernière extension est supprimée.
la source
Ma recommandation est d'utiliser
basename
.C'est par défaut dans Ubuntu, un code visuellement simple et traiter la majorité des cas.
Voici quelques sous-cas pour traiter les espaces et les multi-points / sous-extensions:
Il se débarrasse généralement de l'extension du premier
.
, mais échoue dans notre..
cheminVoici une note importante:
Cependant, vous devez toujours penser à
.hidden_files
pas le résultat attendu. Pour y arriver, utilisez
$HOME
ou/home/user_path/
car encore une fois bash est "inhabituel" et ne développez pas "~" (recherchez bash BashPitfalls)
la source
les sorties:
la source
Comme le souligne Hawker65 dans le commentaire de la réponse de chepner, la solution la plus votée ne prend pas en charge les extensions multiples (comme filename.tar.gz), ni les points dans le reste du chemin (comme this.path / with .dots / in.path.name). Une solution possible est:
la source
Deux problèmes avec votre code:
Je changerais votre code en "name =` echo $ filename | cut -f 1 -d '.' `", comme indiqué ci-dessous (encore une fois, notez les coches arrière entourant la définition de la variable de nom):
la source