Shell :problème de concaténation de strings dans une boucle

Bonjour,

j’ai fait un script bash simple qui concatène toutes les lignes d’un fichier, mais il ne marche pas.

Voici mon script bash nommé contatener.sh :

#!/bin/bash

#On initialise la variable resultat : 
resultat=""

#On récupère tous les lignes du fichier passé en argument :
cat $1 | while read line

#A chaque ligne récupérée, on la concatène avec la variable resultat
do resultat=$resultat.$line
done

#On affiche le résultat final :
echo "Résultat :"$resultat

On imagine que notre fichier est monFichier.txt qui contient 3 lignes :
aaa
bbb
ccc

Et quand je lance :

[guest@localhost~]/bin/bash concatener.sh monFichier.txt

ça devrait m’afficher :

Résultat : aaabbbccc

Mais ça ne marche pas.

Qu’est-ce qui ne va pas dans mon script bash ?

Merci d’avance, cordialement.

Ça aurait été bien de mettre le résultat obtenu en plus du résultat attendu.

C’est pas du PHP, la concaténation de chaîne ne se fait pas avec .

Y’a plusieurs choses qui vont pas…

  1. prends l’habitude d’entourer tes variables par des guillemets " sinon le shell interprète les choses différemment :

[code]$ TEST="abc

def ghi"
$ echo "${TEST}"
abc
def ghi
$ echo ${TEST}
abc def ghi[/code] (note bien les 3 espaces entre def et ghi, qui se transforment en un seul espace quand tu n’utilises pas les guillemets)

  1. la concaténation se fait “naturellement” sans avoir besoin d’un opérateur :

$ TEST1="abc" $ TEST2="def" $ echo "${TEST1}${TEST2}" abcdef

Avec ça tu devrais t’en sortir je pense.

Bonjour syam,

j’ai corrigé mon script avec tes recommandation, et je sais d’où vient le problème :
après le done de la boucle while, la variable resultat est initialisé :confused:

On suppose que le fichier à parser monFicher.txt contient 5 lignes :
a
b
c
d
e

J’ai corrigé le script concatener.sh :

#!/bin/bash

#On initialise la variable resultat :
resultat=""

#On récupère tous les lignes du fichier passé en argument :
cat $1 | while read line

#A chaque ligne récupérée, on la concatène avec la variable resultat
do resultat="${resultat}${line}"
echo "Progression de la concaténation : ${resultat}"
done

#On affiche le résultat final, mais malheursement ${resultat} est égal à rien comme s'il a été réinitialisé :
echo "Résultat :"${resultat}"

Et à la sortie :

[guest@localhost~]/bin/bash concatener.sh monFichier.txt
Progression de la concaténation : a
Progression de la concaténation : ab
Progression de la concaténation : abc
Progression de la concaténation : abcd
Progression de la concaténation : abcde
Résultat : 

Comme vous le voyez, la variable ${resultat} final est égal à rien, et c’est là que je ne comprend pas car elle devrait être égale à abcde.

:think:

La dernière ligne il me semble un guillemet un trop:

echo “Résultat :[size=125]”[/size]${resultat}"

Effectivement y’a un guillemet en trop.
Et le $1 (cat) devrait avoir des guillemets autour également sinon ça va te poser problème si le nom de fichier passé en paramètre contient une espace.

Pour la question de la variable qui reste vide, je me fais avoir à chaque fois… :blush:
La construction … | while … crée un nouveau sous-shell qui se termine à la fin du pipe, et les variables modifiées dans ce sous-shell sont perdues. Pour y remédier, il faut faire ta boucle autrement :

cat "$1" | { RESULTAT="" while read LINE; do RESULTAT="${RESULTAT}${LIGNE}" done echo "Résultat : ${RESULTAT}" }
Ici on force nous-même la création d’un sous-shell avec les accolades {} ce qui permet de réutiliser ${RESULTAT} pendant qu’il est encore disponible. Le sous-shell créé par le pipe | se termine après l’accolade fermante }, plus aucun problème.

Bonjour,

merci à tous pour votre aide.

Syam a dit :

Punaise, alors. Bien vu :023

Merci encore, Problème résolu.

Et faireune commade SED/AWK pour virer tous les retours à la lignes n’aurais pas été plus simple ?

Sinon, il y a tr…

$ echo -e "bla\nbla\nbla" bla bla bla $ echo -e "bla\nbla\nbla" | tr '\n' ' ' bla bla bla

Exact encore plus simple :023