# SHELL : mise en forme de variable

**URL:** <https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 10:04 UTC](https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539 "2016-02-21T22:04:49Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 10:04 UTC](https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539/1 "2016-02-21T22:04:49Z")

</div>

Bonjour,

J’ai un petit problème avec un script.

J’ai une variable qui contient différentes chaines de caractères les unes à la suite des autres. Ces chaines de caractères sont séparées soir par le caractère [mono]entrer[/mono] soit par le caractère [mono]tabulation[/mono].

J’aimerais pouvoir ranger ma variable dans un tableau à deux dimensions. Il faudrait que la [mono]tabulation[/mono] me sépare chaque colonne du tableau et que le [mono]entrer[/mono] me sépare chaque ligne du tableau.

L’idée par la suite et que je puisse accéder à une chaine de caractère de la sorte tab[x][y] pour ne traiter que celles qui m’intéressent.

Y’a t’il moyen de faire ça avec du bash?

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 10:04 UTC](https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539/2 "2016-02-21T22:04:50Z")

</div>

salut,

avec bash, il va falloir être très astucieux, mais ce n’est pas impossible.  
Gawk permet de le faire sans grande complication, car les tableaux étant hashés ils ne respectent pas l’ordre d’apparition dans le tableau.

---

<div class="post-metadata">

**Author:** ![debianhadic](https://www.debian-fr.org/user_avatar/www.debian-fr.org/debianhadic/32/3870_2.png) [@debianhadic](https://www.debian-fr.org/u/debianhadic)\
**Post date:** [Février 21, 2016, 10:04 UTC](https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539/3 "2016-02-21T22:04:51Z")

</div>

Il faut que tu joues avec IFS cette variable indique quel est le séparateur de chaîne.

---

<div class="post-metadata">

**Author:** ![Dunatotatos](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/c2a13f/32.png) [@Dunatotatos](https://www.debian-fr.org/u/Dunatotatos)\
**Post date:** [Février 21, 2016, 10:04 UTC](https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539/4 "2016-02-21T22:04:53Z")

</div>

Hop hop hop, un POC :

[code]#!/bin/sh

string=$(echo -e “foo\tbar\nFOO\tBAR”)  
IFS=’  
'  
for line in $(printf “$string”)  
do  
OLD\_IFS=$IFS  
IFS=" " # voir note  
for word in $line  
do  
printf $word  
printf "\*"  
done  
printf "\n"  
IFS=$OLD\_IFS  
done[/code]

Note : Ceci est une véritable tabulation. L’insérer dans le script apr le raccourci Ctrl + V puis Tab.

Lors de l’exécution :

`$ ./poc.sh 
foo*bar*
FOO*BAR*`

Il ne reste qu’à ajouter des compteurs pour remplir ton tableau, plutôt que d’afficher la variable $word.

EDIT : Pour info, ce script est compatible sh. Par contre, les tableaux n’existent pas en sh, et oblige donc à utiliser bash.  
EDIT 2 : Il y a certainement une solution plus jolie à base de read -a -r, mais pas aussi portable que ce script.

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 21, 2016, 10:05 UTC](https://www.debian-fr.org/t/shell-mise-en-forme-de-variable/67539/5 "2016-02-21T22:05:05Z")

</div>

> [@Dunatotatos](#):
>
> …Note : Ceci est une véritable tabulation. L’insérer dans le script apr le raccourci Ctrl + V puis Tab.…

[quote=«&nbsp;[http://tldp.org/LDP/abs/html/special-chars.html](http://tldp.org/LDP/abs/html/special-chars.html)&nbsp;»]…  
$’ … ’

```
Quoted string expansion. This construct expands single or multiple [b]escaped[/b] octal or hex values into ASCII [3] or Unicode characters.

```

…[/quote]`michel@debG53SW:~$ echo $'x\tx' # j'ai encadré par des "x" le caractère de tabulation afin de le rendre visible
x	x
michel@debG53SW:~$ echo -e "x\tx" # le même résultat peut aussi être obtenu avec l'option -e de la commande echo
x	x
michel@debG53SW:~$ printf "x\tx\n" # ou même tout simplement avec la commande /usr/bin/printf
x	x
michel@debG53SW:~$ `NOTE : On peut remarquer que la commande [mono]echo[/mono] rajoute automatiquement un caractère de fin de ligne (hexa 0a), ce qui n’est pas le cas avec la commande [mono]printf[/mono] (d’où le «&nbsp;\n&nbsp;» que j’ai ajouté pour le look du retour)

Il est donc possible d’utiliser :

`michel@debG53SW:~$ maVarIFS=$'\t'
michel@debG53SW:~$ echo "${maVarIFS}" | hexdump -C
00000000 09 0a |..|
00000002
michel@debG53SW:~$ maVarIFS=$(printf "\t")
michel@debG53SW:~$ echo "${maVarIFS}" | hexdump -C
00000000 09 0a |..|
00000002
michel@debG53SW:~$ `

`michel@debG53SW:~$ maVarIFS=$'\x09' # On peut aussi utiliser le point de code unicode du caractère de tabulation (hexa 09)
michel@debG53SW:~$ echo "x${maVarIFS}x"
x	x
michel@debG53SW:~$ echo "${maVarIFS}" | hexdump -C
00000000 09 0a |..|
00000002
michel@debG53SW:~$ `

=======  
Note aux modérateurs : Merci pour votre réactivité : Ce fil de discussion m’est maintenant visible aussi bien dans la liste des sujets actifs que dans la liste de mes messages 😃
