Re-Salut!
En fait j'ai passe mon script a la moulinette de test, il passe presque tous les test sauf dans certains cas:
-Je récupère mes argument dans tableau que je parcours pour le parsing et pour ce faire j'exécute ceci TAB_ARGS=( $(echo $*) ); mes arguments sont bien récupérés et tout marche bien auf quand on me passe un argument contenant un ou plusieurs espace. Dans ce cas le tableau prend chaque partie de l'argument séparée par des espaces, comme un une chaine a part, et ce parce que echo lui passe la liste des éléments tous séparés par des espaces et sans mette les "" autour des argument contenant les espaces.
Donc par exemple un ./bdsh.sh put key1 "je fais un put", va ranger dans le tableau des arguments :
au lieu de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 put key1 je fais un put
Pour contourner cela, puisque je tiens a conserver mon tableau qui me facilite les manipulations, je fais ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 put key1 je fais un put
TAB_ARGS[$#]=UFOS (pour déclarer mon tableau), pui
pour le remplir. Alors tout se passe bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 echo -n "" > my.back while [ -n "$1" ] ; do echo "$1" >> my.back shift done i=0 while read line do { echo -n ${ligne} > my_store read chaine < my_store TAB_ARGS=([$i]=$chaine) i=$((i+1)) } done < my.back
Tout se passe bien dans les boucles, mes fichiers de stockage sont remplis et avec les ligne correspondants aux arguments, mais une fois sorti de la boucle ou je rempli mon tableau, celui est vide; car en fait il ne fait plus qu'une taille de 1 et contient juste la chaine vide "", et ce quelque soit le nombre d'arguments. Les test sur chaque itération montre bien que l'offset du tableau est bien set a chaque passage, et le fichier my.back contient exactement le nombre d'argument passer, sans segmenter les arguments contenant des espaces.
Alors sortie de la boucle toutes ms variables ont leur valeur, sauf le tableau qui est vide. Et quel que soit la méthode employée, lorsque le tableau est remplie dans une boucle, son contenu n'est valable que dans cette boucle. Alors je pense quelque chose doit certainement m'échapper. J'aimerais utiliser mon tableau comme une variable globale a l'instar de toutes les autres variables
- L'autre souci se situe au niveau de mon fameux select, j'utilise des fois un grep pour matcher des expression, mais quand l'expression en elle même est une option de la commande grep, ca foire non pas a cause de mon programme mais l'erreur est renvoyée par la commande grep elle même. Voici un exemple:
Si l'expression vaut "-e", ou "-v" ou toute autre chose je reçoit une erreur de grep. Je n'ai pas encore pu trouver la syntaxe qui ferais que grep voye l'expression comme un pattern et non comme une option.
Code : Sélectionner tout - Visualiser dans une fenêtre à part value=`grep "$EXPR" store.txt | cut -d "|" -f 1`
J'ai essaye comme ceci:
Pour inhiber les options du grep lui même, mais je reçoit toujours l'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part value=`grep -- "$EXPR" store.txt | cut -d "|" -f 1`
-Le dernier point est bien celui de la protection du sed contre les caractères spéciaux auquel on a essaye de trouver une solution dans le précédent post. La syntaxe ne passe toujours pas.
sedValue=$(echo "$Value" | sed 's/[\&\/]/\\&/g')
ou
Ça ne passe pas dans tous les cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 sedValue="${Value//\\/\\\\}" sedValue="${sedValue//\&/\\&}" sed -i "s#\($Key|\).*#\1$sedValue#" $db_file
Je vous prie bien vouloir une fois de plus user de votre mobilité et votre générosité pour m'aider a peaufiner mon projet.
Merci a tous.
Partager