Je dois concaténer deux variables pour créer un nom de fichier comportant un trait de soulignement. Permet d'appeler mes variables $FILENAME
et $EXTENSION
où le nom de fichier est lu à partir d'un fichier.
FILENAME=Hello
EXTENSION=WORLD.txt
Maintenant...
J'ai essayé ce qui suit sans succès:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Je reçois toujours une sorte de sortie étrange. Habituellement, le soulignement en premier.
J'ai besoin que ça soit
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
la source
la source
Réponses:
Vous pouvez utiliser quelque chose comme ceci:
Cela fonctionne aussi bien:
la source
echo
ne peut éventuellement pas aider. La deuxième commande était déjà donnée dans la question.Votre:
sont tous bien, alors serait:
(mais certainement pas
comme il utiliseNAME=$(echo ${FILENAME}_${EXTENSION})
echo
et l'split+glob
opérateur ).aurait été la même chose que:
comme
_
(contrairement à\
ou'
) est un caractère valide dans un nom de variable.Votre problème est que vous aviez des lignes délimitées par CRLF au lieu de simplement LF, ce qui signifie que ces contenus variables se terminaient par un caractère CR.
Le caractère CR, lorsqu'il est écrit sur un terminal, indique au terminal de déplacer le curseur au début de la ligne. Ainsi,
Hello<CR>_WORLD.TXT<CR>
lorsqu’il est envoyé à un terminal s’affiche_WORLD.TXT
(en remplaçant leHello
).la source
Je suis passé à utiliser la
${FILENAME}_${EXTENSION}
syntaxe mentionnée ci-dessus.J'avais l'habitude d'utiliser
$()
quand j'avais besoin de concaténer deux variables avec un trait de soulignement. Par exemple,$YYYYMMDD$()_$HHMMSS
pour générer un nom de fichier contenant un horodatage au format AAAAMMJJHHMMSS. Le milieu$()
ne renvoie rien et sépare les deux variables.J'ai l'habitude
time
de mesurer les assignations à l'aide de la$YYYYMMDD$()_$HHMMSS
méthode et de certaines des méthodes ci-dessus, et ils ont tous signalé 0 ms sur l'ancien serveur sur lequel je l'utilise. La performance ne semble pas être un problème.la source
$()
fourche un sous-shell dans quelques coquillages (certains l’optimisent au loin). C'est également détourner un opérateur pour quelque chose pour lequel il n'a pas été conçu.${x}_y
c'est ce que tu veux.Vous devez utiliser des variables en minuscule (c'est la meilleure pratique).
Donc, je vais utiliser le nom de fichier et l'extension au lieu de FILENAME et EXTENSION
Comme vous dites que "nom de fichier est lu à partir d'un fichier", je suppose que le script est:
Et que vous souhaitiez concaténer les variables $ filename et $ extension avec un trait de soulignement
_
.Les exemples que vous fournissez (sauf: pas de double \) fonctionnent correctement ici:
Comme un autre:
Votre problème ne réside donc pas dans la façon dont les variables sont collées ensemble, mais dans le contenu des variables. Il semble raisonnable de penser que ceci:
lira un retour chariot final
\r
s'il lit un fichier Windows.Une solution simple (pour ksh, bash, zsh) consiste à supprimer tous les caractères de contrôle de la variable en lecture:
Cela pourrait être simulé avec une valeur qui a un retour chariot:
Ou, en remplaçant la valeur de
filename
:Conclusion.
Donc ça:
Obtiendra la valeur correcte
name
même si les autres vars contiennent des caractères de contrôle.la source
La réponse de Stéphane Chazelas ,
est, bien sûr, la meilleure réponse, et devrait être la réponse acceptée. Mais, dans l'esprit de la réponse de user208145 , voici une alternative:
la source
Vous pouvez également utiliser ceci: séparez les vars séparés par des espaces et concaténez-les à l'aide de tr pour supprimer l'espace.
la source