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.