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

**URL:** <https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:10 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686 "2016-02-21T13:10:56Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![fluo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/e9bcb4/32.png) [@fluo](https://www.debian-fr.org/u/fluo)\
**Post date:** [Février 21, 2016, 1:10 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/1 "2016-02-21T13:10:56Z")

</div>

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](http://contatener.sh) :

```auto
#!/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 :

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

ça devrait m’afficher :

```auto
Résultat : aaabbbccc
```

Mais ça ne marche pas.

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

Merci d’avance, cordialement.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 1:10 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/2 "2016-02-21T13:10:56Z")

</div>

> [@fluo](#):
>
> Mais ça ne marche pas.

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

> [@fluo](#):
>
> Qu’est-ce qui ne va pas dans mon script bash ?

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 «&nbsp;${TEST}&nbsp;»  
> 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 «&nbsp;naturellement&nbsp;» sans avoir besoin d’un opérateur :

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

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

---

<div class="post-metadata">

**Author:** ![fluo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/e9bcb4/32.png) [@fluo](https://www.debian-fr.org/u/fluo)\
**Post date:** [Février 21, 2016, 1:10 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/3 "2016-02-21T13:10:56Z")

</div>

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é 😕

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

J’ai corrigé le script concatener.sh :

```auto
#!/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 :

```auto
[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:](https://www.debian-fr.org/uploads/default/original/1X/98cae0704aea0201d04f151843e80a3ecd391eca.gif "Think")

---

<div class="post-metadata">

**Author:** ![kripteks](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/71c47a/32.png) [@kripteks](https://www.debian-fr.org/u/kripteks)\
**Post date:** [Février 21, 2016, 1:10 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/4 "2016-02-21T13:10:57Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 1:10 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/5 "2016-02-21T13:10:57Z")

</div>

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… 😊  
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.

---

<div class="post-metadata">

**Author:** ![fluo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/e9bcb4/32.png) [@fluo](https://www.debian-fr.org/u/fluo)\
**Post date:** [Février 21, 2016, 1:11 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/6 "2016-02-21T13:11:09Z")

</div>

Bonjour,

merci à tous pour votre aide.

Syam a dit :

> [@](#):
>
> La construction … | while … crée un nouveau sous-shell qui se termine à la fin du pipe,

Punaise, alors. Bien vu ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")

Merci encore, Problème résolu.

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 1:11 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/7 "2016-02-21T13:11:41Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![captnfab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/captnfab/32/3966_2.png) [@captnfab](https://www.debian-fr.org/u/captnfab)\
**Post date:** [Février 21, 2016, 1:11 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/8 "2016-02-21T13:11:41Z")

</div>

Sinon, il y a tr…

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

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 1:11 UTC](https://www.debian-fr.org/t/shell-probleme-de-concatenation-de-strings-dans-une-boucle/54686/9 "2016-02-21T13:11:47Z")

</div>

Exact encore plus simple ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")
