Se connecter / S'enregistrer
Votre question

Aide For , while, until

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
11 Octobre 2007 19:12:17

Alors voilà un nouvel exo :

Citation :
Exercice 1
Ecrire un script qui affiche les fichiers ordinaires, du répértoire donné en paramètre, autorisés en lecture, écriture et/ou en exécution en fonction de l'option -r, -w ou -x donnée aussi en paramètre.

Indication :

  • Donner 3 versions avec le for, le while et le until.

  • Utiliser le case pour sélectionner les fichiers en fonction de l'option -r, -w ou -x.


  • Alors j'ai fait avec le while :

    1. #! /bin/bash
    2.  
    3. while [ $# -ne 1 ]
    4. do
    5. echo "Vous devez mettre un parametre"
    6. exit 1
    7. done
    8.  
    9.  
    10. set `ls -R $1`
    11. while [ $# -ne 1 ]
    12. do
    13. if [ -f $2 ]
    14. then
    15.  
    16. if [ -w $2 -o -x $2 -o -r $2 ]
    17. then
    18. echo "$2"
    19. fi
    20. fi
    21.  
    22. shift
    23. done


    Mais par contre on a pas vu comment faire avec le for et encore moins le until ni les case .
  • Autres pages sur : aide for while until

    11 Octobre 2007 22:09:28

    re, t'es toujours sur tes exo :) 
    ta solution ne fonctionne pas si on met l'option en premier, et l'usage est plutot pour que l'option vienne en premier.
    d'ailleurs tu ne tiens même pas compte de/des option(s) (-r, -x, -w)
    pourquoi le -R pour ls, il n'est pas indiqué qu'il faut les sous répertoires?

    pour en revenir à ta question, le until est pareil que le while, sauf que la condition est invérsée:
    1. while true
    2. do
    3. #...
    4. done

    est équivalent à
    1. until false
    2. do
    3. #...
    4. done


    le for parcourt une liste:
    1. ens="1 2 3"
    2. for arg in $ens
    3. do
    4. echo $arg
    5. done

    affichera

    1
    2
    3

    a c 232 L Programmation
    12 Octobre 2007 11:08:01

    Je vois pas l'intérêt de faire une boucle while ici :
    1. while [ $# -ne 1 ]
    2. do
    3. echo "Vous devez mettre un parametre"
    4. exit 1
    5. done


    Un if suffit largement, non ? Vu que tu vas faire qu'un seul passage...
    Contenus similaires
    12 Octobre 2007 12:49:17

    @OmaR_ShaRi f : eh bien c'est pour pas qu'il ne relance le programme . Et cherche pas plus loin , mon prof est space !

    @coca25 : ah toujours fidèle a son post (et je t'en remercie) . Sinon le -R ba pour avoir plus de fichiers mais j'avoue ils ne le demandent pas . Sinon j'ai pas trop capté ta phrase "ta solution ne fonctionne pas si on met l'option en premier, et l'usage est plutot pour que l'option vienne en premier. " ?! Merci pour le until et le for !! Le until je ne savais pas que c'était l'inverse . Je vais voir çà
    a c 232 L Programmation
    12 Octobre 2007 13:13:20

    Non, mais pour pas qu'il "relance le programme" c'est le exit 1;

    Mais je remplacerai tout le while par (pas testé mais ça devrait le faire) :
    1. if [ $# -ne 1 ] then
    2. echo "Vous devez mettre un parametre"
    3. exit 1
    4. fi
    12 Octobre 2007 13:40:02

    faut juste rajouter un ";" entre le "]" et le "then" ;) 
    13 Octobre 2007 12:00:05

    On fait comment pour faire : echo "Fichier en écriture -w, en lecture -r ou en executable -x ?"
    lire le résultat
    si le résultat est -w
    sortir tout les fichiers du repertoire donnée en ecriture
    ...

    ????
    13 Octobre 2007 12:11:40

    pour lire une entrée:
    1. echo -n "Tape qq chose: "
    2. read var
    3. echo Tu as tapé $var

    pour n'afficher que les fichier avec une certaine permissions, tu peux voir du coté de "find" ou alors un "ls", puis tester tous les fichiers
    13 Octobre 2007 12:27:31

    j'ai cherché dans le man pour le find et ls mais je n'ai pas trouvé d'options pour trouver que des fichiers en ecriture ...
    J'aurais bien mis find/$1 -w
    13 Octobre 2007 12:57:26

    alors cherche mieux, mais tu n'es pas obligé d'utiliser find, tu peux utiliser ls et tester fichier par fichier.

    man find:
    Citation :
    -perm mode
    Fichier dont les autorisations d'acces sont fixees exactement au mode indique (en notation symbolique ou octale). La notation symbolique utilise le mode 0 comme point de depart.
    -perm -mode
    Fichier ayant au moins toutes les autorisations indiquees dans le mode.
    -perm +mode
    Fichier ayant certaines des autorisations indiquees dans le mode.

    et surtout apprend à utiliser le man, parce que "find/$1 -w", ca veut strictement rien dire:
    Citation :

    find [chemin...] [expression]

    donc la syntaxe pour chercher dans le répertoire un fichier commencant par "sa" par exemple est:

    find . -name "sa*"

    pour ne pas chercher récursivement:

    find . -maxdepth 1 -name "sa*"

    et pour les permissions, il faut les indiquer en chiffre: 1 (x), 2 (w), 4 (r)
    Gestion des droits sous linux
    find -maxdepth 1 -perm -400

    t'affichera les fichiers/répertoires qui ont au minimum le droit de lecture pour l'utilisateur courant.

    13 Octobre 2007 14:38:00

    Merci , mais par contre c'est quoi l'intéré de mettre 400 ? On ne peut pas juste mettre 4 ?!

    Et un peu d'aide pour le case. Parce que notre prof est sympas, il nous demande çà mais on pa vu comment ca fonctionne :D 
    13 Octobre 2007 16:06:36

    sans être méchant:
    si tu te donnais la peine de lire les liens que je te donne (même sur l'ancien topic en ce qui concerne le "case"), tu comprendras beaucoup mieux, par exemple pourquoi le 400 (d'ailleurs, c'était un exemple, tu peut très bien t'en passer), ou alors donne des exemples, explique ou tu bloques ou ce que tu ne comprends pas, et on se fera un plaisir de t'aider, mais te faire l'exercice... une fois, c'est bon.
    13 Octobre 2007 16:10:13

    ah oui j'avais zappé tes sites, vai voir çà .
    13 Octobre 2007 16:52:56

    Alors voilà, le case je galere :

    1. case $2 in
    2. '-w')
    3.  
    4. find -maxdepth 1 -perm -200
    5. echo "$3 est en écriture";;
    6.  
    7. '-x')
    8. find -maxdepth 1 -perm -100
    9. echo "$3 est en executable";;
    10.  
    11.  
    12. '-r')
    13.  
    14. find -maxdepth 1 -perm -400
    15. echo "$3 est en lecture";;

    Je suppose que c'est faux mais j'ai regardé les sites que tu m'a passer, mais bon, pas trop trop capté . Faudrait que ca fasse en fonction de l'option mise (-w...) ca fasse le cas qu'il faut et çà je sais pas faire :D 
    13 Octobre 2007 17:15:40

    sur le site que je t'ai passé dans l'autre topic: Initiation à bash
    Citation :
    case variable in
    cas1)
    commande1
    ;;
    cas2)
    commande2
    ;;
    *)
    commande_par_defaut
    ;;
    esac


    sur ton exemple, je vois pas le "esac"!
    le $3, à quoi il correspond?
    tu ne passes pas le répertoire à find, il te listera toujours le répertoire courant.
    sinon, si tu rajoutes le "esac", le case fonctionne (enfin si le $2 contient bien quelque chose!)
    13 Octobre 2007 17:25:07

    a le esac a été oublié quand j'ai copier coller ^^

    1. #! /bin/bash
    2.  
    3. while [ $# -ne 2 ];
    4. do
    5. echo "Vous devez mettre un parametre et une option"
    6. exit 2
    7. done
    8.  
    9.  
    10. set `ls $1`
    11. while [ $# -ne 1 ];
    12. do
    13. if [ -f $3 ];
    14. then
    15.  
    16. case $2 in
    17. '-w')
    18.  
    19. find -maxdepth 1 -perm -200
    20. echo "$3 est en écriture";;
    21.  
    22. '-x')
    23. find -maxdepth 1 -perm -100
    24. echo "$3 est en executable";;
    25.  
    26.  
    27. '-r')
    28.  
    29. find -maxdepth 1 -perm -400
    30. echo "$3 est en lecture";;
    31. esac
    32. fi
    33.  
    34. shift
    35. exit 3
    36. done
    a c 232 L Programmation
    13 Octobre 2007 18:56:49

    Là comme ça, je suis pas un expert du bash, mais je vois pas d'erreur.
    Alors pour regarder s'il va bien dans le case, tu peux faire un :
    1. *) echo "dans case mais pas dans option" ;;


    Comme ça tu verras si ton problème vient de là ou pas.

    Faut déboguer manuellement...
    13 Octobre 2007 19:44:28

    ou alors pour debugger un script bash, il faut lui ajouter l'instruction "set -x":
    1. #!/bin/bash
    2. set -x
    3.  
    4. echo 1
    5. var=2
    6. echo $var
    7. read c
    8. echo $c

    te sortira à l'execution:

    + echo 1
    1
    + var=2
    + echo 2
    2
    + read c
    s
    + echo s
    s

    le + ... étant les commandes, ainsi, tu vois le cheminement.
    13 Octobre 2007 20:49:38

    Et ca va me donnez de koi de faire çà ?

    Je viens de tester mon programme n'affiche rien, donc bon il n'allait pas trop l'air de marcher. Savez-vous pourquoi?
    14 Octobre 2007 00:08:41

    je dirais parce ce n'est pas fait correctement, j'ai bon? :p 

    tu utilises ls + find, je vois pas l'interet (tu n'as pas compris l'utilité, je pense)
    le "set `ls $1`" ecrase les parametre, $2 ne sera plus égale à l'option (d'ailleurs, je t'ai dis que l'option vient en premier normalement.)

    14 Octobre 2007 09:03:13

    Que faut il mettre a la place de set `ls $1` ?

    Et on ne vas pas mettre les case en premier vu qu'il nous faut le répertoire?!
    14 Octobre 2007 13:11:28

    tu peux sauvegarder l'option dans une variable!
    et tu peux aussi enlever le find.
    Tom's guide dans le monde
    • Allemagne
    • Italie
    • Irlande
    • Royaume Uni
    • Etats Unis
    Suivre Tom's Guide
    Inscrivez-vous à la Newsletter
    • ajouter à twitter
    • ajouter à facebook
    • ajouter un flux RSS