Script [KSH]

Résolu/Fermé
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 - Modifié par edwingb le 10/02/2012 à 09:51
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 - 10 févr. 2012 à 15:35
Bonjour,


#!/bin/ksh

echo "########################################################
Menu :
1 --> Saisir Nom
2 --> Lister les noms saisie
.
.
########################################################"
read reps
case $reps in
1 )
rep=1
i=1
while [[ $i -lt 10 && $rep -eq 1 ]]; do
echo "Entrez un nom : "
read nom
array[${i}]=${nom}
((i++))
echo "Voulez-vous entrer un autre nom ? (1/0)"
read rep
done
n=1
for j in ${array[@]}; do
echo "Element $n = $j"
((n++))
done > element;;
2 )
p=1
for i in ${array[@]}; do
echo "Element $p = $i"
((p++))
done;;
.
.
.
_______________________________________________________________________
J'aimerai pouvoir garder la valeur de « j » de sorte que si on ressaisie un nom plus tard, le nouveau nom saisie soit rajouté dans le fichier « élément » après les autres noms déjà saisie.
Ou si vous avez une solution qui fonctionnerait mieux ?
________________________________________________________________________

Merci pour votre aide
A voir également:

4 réponses

Bonjour,

Je ne suis pas sûr d'avoir compris la question, je réponds à ce que j'ai compris.
D'abord, tu vides le fichier au départ du programme :
> element

Ensuite, quand tu entres dans ton 1), il te suffit d'écrire à la fin du fichier :
done >> element
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
10 févr. 2012 à 09:55
Enfaite a la place de "> element" je met ">> element" ?
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
10 févr. 2012 à 10:12
Ca fonctionne dans le fichier "element" mais ca ne donne pas ce que j'attendai lol

element 1 = edwing
element 2 = charles
element 1 = edwing
element 2 = gm
...
la valeur de "j" reprend a zero
0
Pour que ton "j" soit toujours à jour, tu peux l'initialiser de cette manière :
j=$(wc -l elements)
((j++))

wc -l te retourne le nombre de lignes du fichier.

Par contre cette solution ne gérera pas les doublons
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
Modifié par edwingb le 10/02/2012 à 11:13
J'ai essayé plusieur methode mais je ne vois pas comment utiliser :
j=$(wc -l element)
? :/
0
Désolé j'ai mal lu, je parlais de n, pas de j.
Et je n'avais pas vu que tu voulais que ça fonctionne en relançant le programme (je pensais que tu bouclais).


Donc : (script non testé, mais l'idée est là) :
#!/bin/ksh
echo "########################################################
Menu :
1 --> Saisir Nom
2 --> Lister les noms saisie
.
.
########################################################"
read reps
case $reps in
1 )
rep=1
i=1
while [[ $i -lt 10 && $rep -eq 1 ]]; do
echo "Entrez un nom : "
read nom
array[${i}]=${nom}
((i++))
echo "Voulez-vous entrer un autre nom ? (1/0)"
read rep
done
n=1
if [ -f element ] ; then
    n=$(wc -l element)
for j in ${array[@]}; do
echo "Element $n = $j"
((n++))
done >> element;;
2 )
p=1
for i in ${array[@]}; do
echo "Element $p = $i"
((p++))
done;; 
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
Modifié par edwingb le 10/02/2012 à 10:00
Enfaite mon probleme est que lorsque je saisi mes noms

MENU

entrer un nom :
edwing
entrer un nouveau nom ? oui
entrer un nom
charles
entrer un nouveau nom ? non

liste des nom :
edwing
charles

A ce moment je me dis "mince" j'ai oublié de rentrer un autre nom, donc je vais ressaisir un autre nom

MENU

entrer un nom :
gm
entrer un nouveau nom ? non

liste des noms :
gm
charles

J'aimerai que la liste soit :

edwing
charles
gm
0
Utilisateur anonyme
10 févr. 2012 à 11:40
salut,

donc, en fait, tu ne veux que les noms dans le fichier, pas l'indice, c'est ça ?
alors, pas besoin d'une boucle for pour écrire dans le fichier
printf '%s\n' "${saisie[@]}" >> fichierDzElements
en utilisant la "double-redirection", qui permet d'ajouter du contenu à la fin d'un fichier.
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
10 févr. 2012 à 11:55
Enfaite il faudrait que j'enleve :
for j in ${array[@]}; do
echo "Element $n = $j"
((n++))
done > element;; 


Et que je le remplace par :
printf '%s\n' "${array[@]}" >> element

?
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
Modifié par edwingb le 10/02/2012 à 12:29
Trouvé !!!!!!

case $reps in   
1 ) 
.... 
for j in ${array[@]}; do 
echo "$j" 
done >> element;; 
2 ) 
p=$(cat element | wc -l) 
i=1 
while [[ i -lt $p ]]; do 
head -$i element | tail -1 
((i++)) 
done;;


ET cela foncitonne parfaitement :D
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
10 févr. 2012 à 12:28
Merci pour votre aide gm et qqunquicommenceparQ
0
Utilisateur anonyme
10 févr. 2012 à 12:51
ça fonctionne, c'est bien. mais je suis à eu près sûr que d'ici peu de temps tu verras dans ce script des choses inutiles, genre
cat fichier | wc -l
alors que
wc -l <fichier
est plus court...
le 'while read' qui suit serait avantageusement remplacé par un simple 'cat fichier' lol

et pour répondre à ta question, oui : 'printf' remplace le 'for'
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
10 févr. 2012 à 13:46
lol oui c'est que je suis vraiment compliqué la ^^

Ok pour le printf
0
edwingb Messages postés 343 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 20 novembre 2012 43
Modifié par edwingb le 10/02/2012 à 13:58
Mais je ne sais pas si ça vient de mon script mais quand je rentre 3 noms, dans mon fichier "element" j'en retrouve 4 avec redondance du 2ieme nom
Pour remédier au probleme j'ai utilisé :
sed '$d' element
qui affiche le fichier "element" sans la dernière ligne..
0
ton script a peut-être changé depuis ton premier message, ce serait bien si c'est le cas d'en poster la dernière version.

<vendredi> «je ne sais pas si ça vient de mon script»
...à moins que des lutins patinent sur ton disque dur...
</vendredi>
0