GNU/Linux >> Tutoriels Linux >  >> Linux

Des chaînes sont manquantes après la concaténation de deux chaînes variables ou plus dans Bash ?

Lorsque j'exécute deux boucles while et que j'essaie de concaténer deux chaînes variables (à partir de deux boucles), la sortie finale (chaîne) est bizarre. J'ai essayé différentes manières de concaténer mais je n'ai pas obtenu la réponse :Voici le code :
[J'ai besoin de vfile="var1_Amon_My_model1*.nc" ]

#!/bin/bash
jcount=1
extn="*.nc"
while read line
do
mname=$line
echo " Working on model - " $mname
echo " and model number = "$jcount
while read line
do
vname=$line
vfile="${vname}""_Anom_""${mname}""${extn}"
echo $vfile
done<varlists.txt
echo "******************************************"
jcount=$((jcount+1))
done<model_test1.txt

Dans varlists.txt

var1
var2

Dans model_test1.txt

My_model1
My_model2

Après avoir exécuté le script, il s'affiche

 Working on model -  My_model1
 and model number = 1
*.ncm_My_model1
*.ncm_My_model1
******************************************

Réponse acceptée :

Vos fichiers texte ont des fins de ligne Windows/DOS CRLF.

Les chaînes se concatènent correctement, mais l'octet de retour chariot est laissé à la fin de vname et mname , car il ne fait pas partie d'une ligne se terminant sous Unix et n'a donc pas été utilisé par read . Lorsque vous imprimez la chaîne, l'affichage est mutilé à la place. Les retours chariot ramènent le curseur au début de la ligne (comme une machine à écrire), ce qui permet d'écraser le texte.

Lorsque vous imprimez du texte avec un retour chariot, le texte jusqu'au CR apparaît normalement, puis le curseur de sortie revient au début, puis les parties ultérieures de la chaîne sont imprimées par-dessus les parties précédentes. C'est pourquoi le "*.nc " s'affiche au début de la ligne dans votre sortie rapportée même si " ${extn} ” est le dernier – mname se termine par un retour chariot.

Vous pouvez exécuter vos fichiers texte via dos2unix pour supprimer les octets de retour chariot supplémentaires. Vous pouvez également utiliser ${vname%$'r'} dans le script pour tronquer les CR de fin si vous ne voulez pas ou ne pouvez pas modifier les fichiers.


Linux
  1. Dans Bash, comment ajouter une chaîne après chaque ligne dans un fichier ?

  2. Comment comparer deux chaînes au format de version séparées par des points dans Bash ?

  3. Comment écrire une chaîne de plusieurs lignes en utilisant Bash avec des variables ?

  4. Shell Script, lu sur la même ligne après avoir renvoyé un message

  5. Convertir une chaîne de texte en bash en tableau

Utiliser plus pour afficher les fichiers texte sur la ligne de commande Linux

Chaînes de concaténation bash

Comment utiliser bash if -z et if -n pour tester des chaînes sous Linux

Script Bash vers Center Fortune/texte depuis Stdin/pipe ?

Comment lire la dernière ligne d'un fichier texte dans une variable à l'aide de Bash ?

texte d'écho avec une nouvelle ligne dans bash