OVH Cloud OVH Cloud

[ksh] Retour ls en liste de choix

13 réponses
Avatar
bil.bao
bonjour =E0 vous...

Je d=E9bute dans le monde du korn shell... et je cherche =E0 faciliter le=20
travail de certain utilisateurs...
Dont moi :)

comment dois-je proc=E9der pour afficher dans une "liste de choix" le=20
retour d'une commande ls ?
Et id=E9alement r=E9cup=E9rer le nom du fichier ou dossier qu'a s=E9lection=
ner=20
l'utilisateur ?

Merci d'avance pour votre aide !

Bil

10 réponses

1 2
Avatar
Pascal Bourguignon
writes:

bonjour à vous...

Je débute dans le monde du korn shell... et je cherche à faciliter le
travail de certain utilisateurs...
Dont moi :)

comment dois-je procéder pour afficher dans une "liste de choix" le
retour d'une commande ls ?
Et idéalement récupérer le nom du fichier ou dossier qu'a sélectionné
l'utilisateur ?

Merci d'avance pour votre aide !


Voir par exemple:
http://groups.google.com/group/fr.comp.os.unix/msg/7f3116ce7e26e12e

C'est de la coquille bash, mais ça devrait pouvoir tourner sans trop
de modifications en ksh.

Si on considère la seconde implémentation, commencer simplement par:

menu_items=( $(ls) )


--
__Pascal Bourguignon__ http://www.informatimago.com/

There is no worse tyranny than to force a man to pay for what he does not
want merely because you think it would be good for him. -- Robert Heinlein

Avatar
bil.bao
C'est exactement ce qu'il me fallait !
Merci beaucoup Pascal
Avatar
bil.bao
C'est exactement ce qu'il me fallait !
Merci beaucoup Pascal
Avatar
bil.bao
Pascal je m'excuse.. mais sans vouloir abuser...

Le script fonctionne parfaitement sous un shell bash

Cependant, je n'arrive pas à le faire fonctionner en ksh.
En faite c'est la partie de la boucle qui me pose des problèmes...

L'affichage n'est pas très coérant et l'incrémentation des choix ne s e
fait pas.
ça ne tient pas à grand chose mais je suis incapable de voir ou est
l'erreur...

menu_items=$(ls ../repository)
menu_lines=4
menu_span=$(( ( $menu_lines - 1 + ${#menu_items[@]} ) / $menu_lines ))
column_width=$(( 150 / $menu_span ))
format="%2d %-$(( ${column_width} - 3 ))s"
i=0
while [ "${i}" -lt "${menu_lines}" ] ; do
j=$i
while [ "${j}" -lt "${#menu_items[@]}" ] ; do
printf " $format $j ${menu_items[$j]} "
j="${j} + ${menu_lines}"
done

printf "n"
i=$(( $i+1 ))
done

Mille fois merci !
Avatar
Jean-Louis Liagre
...
comment dois-je procéder pour afficher dans une "liste de choix" le
retour d'une commande ls ?
Et idéalement récupérer le nom du fichier ou dossier qu'a sélectionner
l'utilisateur ?


- - - - - - - - - - - -
#!/bin/ksh

select choix in $(ls)
do
break
done

echo "choix=$choix"
- - - - - - - - - - - -

Les noms de fichiers ne doivent pas contenir d'espaces.

Avatar
lhabert
Jean-Louis Liagre :

$(ls)


Plutôt « * ».

Avatar
Pascal Bourguignon
writes:

Pascal je m'excuse.. mais sans vouloir abuser...

Le script fonctionne parfaitement sous un shell bash

Cependant, je n'arrive pas à le faire fonctionner en ksh.
En faite c'est la partie de la boucle qui me pose des problèmes...

L'affichage n'est pas très coérant et l'incrémentation des choix ne
se fait pas. ça ne tient pas à grand chose mais je suis incapable
de voir ou est l'erreur...


Je suis désolé, mais je n'utilise pas ksh. En grande partie pour
cette raison, que les choix ne s'incrémentent pas. Il semble que
modifier une variable à l'intérieur d'une boucle while n'a pas
d'impact hors de la boucle, au moins dans les cas où le corps de la
boucle s'exécute dans un sous-processus.

Pour cette raison, et d'autres, je trouve que programmer une telle
fonction avec un shell est limite. (J'ai mieux à faire qu'apprendre
les tonnes de détails arbitraires et idiosyncrasies spécifiques
nécessaires pour pouvoir écrire correctement (sans dire portablement)
des programmes en shell).

Je conseille d'utiliser un vrai langage de programmation pour écrire
ce genre de "script", par exemple, scsh, clisp, ruby, etc, n'importe
quoi, mais pas un shell.


menu_items=$(ls ../repository)
menu_lines=4
menu_span=$(( ( $menu_lines - 1 + ${#menu_items[@]} ) / $menu_lines ))
column_width=$(( 150 / $menu_span ))
format="%2d %-$(( ${column_width} - 3 ))s"
i=0
while [ "${i}" -lt "${menu_lines}" ] ; do
j=$i
while [ "${j}" -lt "${#menu_items[@]}" ] ; do
printf " $format $j ${menu_items[$j]} "
j="${j} + ${menu_lines}"
done

printf "n"
i=$(( $i+1 ))
done

Mille fois merci !



--
__Pascal Bourguignon__ http://www.informatimago.com/

This universe shipped by weight, not volume. Some expansion may have
occurred during shipment.

Avatar
bil.bao
Merci à tous pour votre aide !

Pascal, malheureusement je n'ai pas vraiment le choix du language.
C'est un peu imposé par la société... et ce que tu me dis ne m'éton ne
qu'a moitié
compte tenu des différentes décisions qui se prennent chez nous ;)
ça ne changerait pas mon problème de toute manière vu que je n'y
connais rien :)
Je te remercie de tes conseils qui me serviront probablement pour la
suite...

Jean-Luc et Louis... Merci pour le select !
C'est un peu moins sexy en ce qui concerne la mise en forme... mais
c'est parfaitement fonctionnel en l'état et il faut le dire plus
simple

A+

Bil
Avatar
Jean-Louis Liagre
Jean-Louis Liagre :

$(ls)


Plutôt « * ».


C'est vrai, et le résultat est identique, mais ça esquive la question
(retour de ls).


Avatar
Stephane Chazelas
2007-01-30, 21:43(+01), Jean-Louis Liagre:
Jean-Louis Liagre :

$(ls)


Plutôt « * ».


C'est vrai, et le résultat est identique, mais ça esquive la question
(retour de ls).


sigh...

Non, le resultat n'est pas identique. $(ls) ne fait pas de sens
si on n'a pas au prealable modifié IFS et fait un set -f. Et *
devient "*" s'il n'y a pas de fichier dans le repertoire
courant.

--
Stéphane



1 2