Précédent   Forum des professionnels en informatique > Systèmes > Linux
Linux Forum d'entraide sur le système Linux. Avant de poster -> Tutoriels Linux, F.A.Q Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 07/02/2010, 10h23   #1
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
Par défaut Un tout petit script génant

Bonjour tout le monde .
J'essaye d'ecrire un script permettant d'afficher les arguments saisis mais dans l'orde inverse jusqu'à l'ordre K (K saisi par l'utilisateur) et de garder le reste tel qu'il est. Juste pour l'opération d' inverser j'ai essayé cela :

Code :
1
2
3
4
for i in $*
do
echo ${ $# - $i }
done
Mais on me parle d'erreur de substitution! et Que faire de K ??
Merci pour votre aide

Dernière modification par Caro-Line ; 07/02/2010 à 10h47. Motif: Ajout balises code (bouton #) + Orthographe
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 11h07   #2
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
sans l'énoncé complet, c'est pas évident de savoir comment est fourni K...

admettons que K soit donné par le premier paramètre positionnel (c'est plus facile)

on affecte le premier paramètre positionnel à K
on renomme les paramètres positionnels
on utilise une C-style_for_loop qui décrémente une variable à laquelle on affecte $K, et qui doit demeurer supérieure à zéro
enfin on affiche l'indirection de la variable qui se décrémente à chaque boucle

Voilà, y a plus qu'à coder...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 13h07   #3
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
oui en effet le K doit etre entrer par l'utilisateur
J'ai pas compri ce que vous voulez dire par l'indirection de la variable.
et pourquoi ce que j'ai ecrit ne marche pas ? pourtant ça a l'air loqique..
Merci de votre reponse
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 13h24   #4
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
une indirection, c'est quand la valeur d'une variable (a=b) est le nom d'une autre variable (b=c), et qu'on remplace par la valeur de cette autre variable (c)
Code :
1
2
3
4
a=b
b=c
echo "${!a}"
c
comme tu le vois c'est introduit par un point d'exclamation.

Citation:
Envoyé par neutrall
en effet le K doit etre entrer par l'utilisateur
mais comment ?
Citation:
Envoyé par neutrall
pourquoi ce que j'ai ecrit ne marche pas ? pourtant ça a l'air loqique
peux-tu commenter ce que tu a écrit ? ce que tu en attends...

Dernière modification par N_BaH ; 07/02/2010 à 14h01.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 14h23   #5
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
moi j 'ai cru ke pour afficher inversement il suffit d'ecrire
echo $ ($# - $i) à linterieur de la boucle
c est pas vrai ?
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 14h50   #6
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
non.

Tu peux nous donner un exemple d'entrée et de sortie attendue ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 16h18   #7
Membre émérite
 
Avatar de ssmario2
 
Mounir Orfi
Inscription : avril 2007
Messages : 665
Détails du profil
Informations personnelles :
Nom : Mounir Orfi
Localisation : Maroc

Informations forums :
Inscription : avril 2007
Messages : 665
Points : 915
Points : 915
Tu peux faire comme suit:
Code :
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
 
list=""
 
while [ $# -gt 0 ]
do
	list=$1" "$list
	shift
done
echo $list
Si l'espace qui vient s'incruster en dernier te gênes :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 
if [ $# -gt 0 ]
then
	list=$1
	shift
fi
 
while [ $# -gt 0 ]
do
	list=$1" "$list
	shift
done
echo $list
__________________
To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --
ssmario2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 17h31   #8
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
en fait mon script doit inverser l'affichage des element entré en argument .

exemple : ./script 1 2 3 4 5

apres execution :
5 4 3 2 1
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 17h32   #9
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
Pour ton Script SSmario, il m 'affiche une erreur (fin de fichier prematuré)
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 19h22   #10
Membre émérite
 
Avatar de ssmario2
 
Mounir Orfi
Inscription : avril 2007
Messages : 665
Détails du profil
Informations personnelles :
Nom : Mounir Orfi
Localisation : Maroc

Informations forums :
Inscription : avril 2007
Messages : 665
Points : 915
Points : 915
peux-tu joindre le fichier en question ainsi que le message d'erreur exact.
__________________
To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --
ssmario2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 19h49   #11
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
j'ai executé ton script tel qu'il est , à savoir :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
if [ $# -gt 0 ] 
then
	list=$1
	shift
fi
while [ $# -gt 0 ]
do
	list=$1" "$list
	shift
done
echo $list # ligne 12
on me renvoit un message d erreur : Erreur ligne 13 fin de fichier prematurée
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 20h22   #12
Modérateur
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 703
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 703
Points : 4 346
Points : 4 346
Salut.

Citation:
Envoyé par neutrall Voir le message
en fait mon script doit inverser l'affichage des element entré en argument .

exemple : ./script 1 2 3 4 5

apres execution :
5 4 3 2 1
Tu peut enregistrer tes paramètres dans un tableau monodimensionnel et inverser les valeurs à l'aide d'un second tableau, exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 #!/bin/bash
 
i=0
for f in $*
do
    tab[i]=$f
    let i=$i+1
done
 
for (( i=0 ; i<$# ; i++ ))
do
    let j=$#-$i-1
    tab2[j]=${tab[i]}
done
 
for (( i=0 ; i<$# ; i++ ))
do
    printf "${tab2[i]} "
done
echo ""
Voici le résultat obtenu à l'exécution :
Code :
1
2
3
4
5
6
ok@precario-c700:~$ ./script.sh 1 2 3 4 5
5 4 3 2 1
ok@precario-c700:~$ ./script.sh toto titi tata
tata titi toto
ok@precario-c700:~$ ./script.sh avant après
après avant
Cordialement,
Idriss
__________________
modérateur rubriques Linux/Unix et chat
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 20h27   #13
Invité régulier
 
Inscription : juillet 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 41
Points : 6
Points : 6
c'est trés proche ou plutot du langage C .Mois je veux le faire exclusivement en bash shell avec ses propre commandes .
Merci de ta réponse
neutrall est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 20h31   #14
Modérateur
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 703
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 703
Points : 4 346
Points : 4 346
Citation:
Envoyé par neutrall Voir le message
c'est trés proche ou plutot du langage C .Mois je veux le faire exclusivement en bash shell avec ses propre commandes .
Merci de ta réponse
Et pourtant, c'est du Bash à 100% ... il n'y a pas qu'en C qu'on peut faire ce genre d'algorithme.

Sinon le script de ssmario2 s'exécute bien chez moi ... essayes peut être ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 #!/bin/bash
 
if [ $# -gt 0 ] 
then
    list=$1
    shift
fi
while [ $# -gt 0 ]
do
    list=$(echo "$1" "$list")
    shift
done
echo $list
__________________
modérateur rubriques Linux/Unix et chat
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 03h55.


 
 
 
 
Partenaires

Hébergement Web