Script pour spliter une chaine de caractères

Fermé
Arnaud - 2 mai 2010 à 13:15
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 3 mai 2010 à 22:34
Bonjour, mon problème est certainement très simple à régler mais je n'ai pas de connaissance dans ce domaine. Je dois faire un shell script du type monscript.sh qui recoit en paramètre une variable qui est appelé de la manière suivante : monscript.sh mavariable

Jusqu'à là pas de soucis particuliers. Je souhaite que mon script me sorte quelque chose qui ressamble à cela.

$ monscript.sh "pour faire une tarte au pomme il faut : des pommes , de la farine , du sucre ..."

doit retourner :

des pommes
de la farine
du sucre
...

mon problème c'est que le nombre de variables n'est pas défini et je suppose qu'il faut que que je fasse une boucle tant qu'il y a des variables.

Je vous remercie de votre aide. Bonne week end à tous.
A voir également:

1 réponse

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
Modifié par mamiemando le 2/05/2010 à 14:51
Le problème c'est qu'itérer sur le nombre d'arguments ne t'avancera pas à grand chose. Il vaut mieux récupérer la chaîne d'argument via $@ (anciennement $* qu'on évite aujourd'hui d'utiliser). La solution que je vais te proposer n'est peut être pas la plus élégante mais elle à l'air de marcher.

L'idée de la solution que je te propose consiste à découper la chaîne d'abord sur le caractère : de sorte à extraire tout ce qui est derrière ce caractère.

Une fois cette sous-chaine d'ingrédients isolée, on la découpe sur le caractère ','. Chaque tronçon correspond à l'un des ingrédients. On continue jusqu'à ce que la chaîne ingredient soit vide.

#!/bin/bash    

# champ1:champ2 --> on extrait le 2e champ    
ingredients=$(echo $@ | cut -d':' -f2)    
echo "ingredients=[$ingredients]"    

# maintenant on extrait chaque ingrédient    
ingredient=$(echo $ingredients | cut -d',' -f1)    
i=1    
while [ "$ingredient" != "" ]    
do    
    echo $ingredient 
    i='expr $i + 1'    
    ingredient=$(echo $ingredients | cut -d',' -f$i)    
done


Ce qui donne :

(mando@aldur) (~) $ sh plop.sh "pour faire une tarte au pomme il faut : des pommes, de la farine, du sucre ..."  
ingredients=[ des pommes, de la farine, du sucre ...]  
des pommes  
 de la farine  
 du sucre ...  


En l'état le programme n'est pas tout à fait parfait dans la mesure ou les espaces situés devant et derrière les virgules impactent les chaîne d'ingrédient. La commande tr permet de virer les espaces en plusieurs exemplaires. À toi de voir comment arranger les chaînes "ingredient".

D'autre part, autant ce programme est un peu lourd à écrire en shell, autant avec awk ça se fait vraiment bien (et sans se prendre la tête avec les espaces devant et derrière les virgules).

Bonne chance
0
Re- merci pour ta réponse mamiemando ca à l'air d'être ce que je souhaite mais je rencontre une difficultée. Je ne sais pas si c'est lié au linux que j'utilise où à autre chose

[root@MaMachine sbin]# monscript.sh
ingredients=[pomme,poire,bannane]
1 pomme
invalid byte or field list Try 'cut --help' for more information.
0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
3 mai 2010 à 22:34
As-tu modifié le script que je t'ai indiqué ? Peux tu me donner la manière dont tu l'as exécuté. Exemple :

sh plop.sh "pour faire une tarte au pomme il faut : des pommes, de la farine, du sucre ..." 


Bonne chance
0