Script de listing

Bonjour tout le monde !

Je suis en train de faire un petit script qui aurait pour but de lister tout les noms de fichiers présent dans un dossier.

J’essaie en le faisant avec une fonction “if” mais je sais pas du tout si je suis parti du bon pied ou pas…

[code]#!/bin/bash

echo “Voulez les films commançant par une lettre particulière [Y/N] ?”
read ouinon

if [$ouinon=“y”] || [$ouinon=“Y”] || [$ouinon=“oui”] || [$ouinon=“OUI”] || [$ouinon=“yes”] || [$ouinon=“YES”]
then
echo “Quelle est votre lettre ?”
read lettre
ls -a /home/maxime/films/$lettre

elif [$ouinon=“n”] || [$ouinon=“N”] || [$ouinon=“non”] || [$ouinon=“NON”] || [$ouinon=“no”] || [$ouinon=“NO”]
then
echo “Voici la liste de tous les films disponible :”
ls -a /home/maxime/films

else
echo "Il faut taper “oui” ou “non” et pas $ouinon "
exit 1

fi
exit 0[/code]

En effet, lorsque je l’exécute, en plus de ne pas faire ce que je voudrais, il me renvoie toutes les lignes “if” et “elif” avec des “NOT FOUND” et il me renvoie aussi le “echo” du else.
Je comprends pas trop ce que j’ai pu manquer. :017

Merci d’avance pour votre aide !

Quelques conseils :
[ul]
[li]protège tes variables ($ouinon => “$ouinon”)[/li]
[li]met un espace après [mono][[/mono] et avant [mono]][/mono][/li]
[li]utilise l’option -x de bash pour voir les commandes réellement exécutées[/li]
[li]/home/maxime pourrait à mon humble avis être remplacé par $HOME[/li][/ul]

Oui j’avais mis les “” avant “$ouinon” là je les avais enlevées pour tester…

donc :

  • “$ouinon” ==> Fait !
  • les espaces avant et après les [ ] ==> Fait !
  • /home/maxime en $HOME ==> Fait ! (A condition d’exécuter le script en tant de maxime et pas en tant que root :wink: )
  • sh - x ==> Fait ! merci pour l’info ! :wink:

Voilà à quoi ça ressemble maintenant :

[code]#!/bin/bash

echo “Voulez les films commançant par une lettre particulière [Y/N] ?”
read ouinon

if [ “$ouinon”=“y” ] || [ “$ouinon”=“Y” ] || [ “$ouinon”=“oui” ] || [ “$ouinon”=“OUI” ] || [ “$ouinon”=“yes” ] || [ “$ouinon”=“YES” ];
then
echo “Quelle est votre lettre ?”
read lettre
echo | ls -a $HOME/films/"$lettre"*

elif [ “$ouinon”=“n” ] || [ “$ouinon”=“N” ] || [ “$ouinon”=“non” ] || [ “$ouinon”=“NON” ] || [ “$ouinon”=“no” ] || [ “$ouinon”=“NO” ];
then
echo “Voici la liste de tous les films disponible :”
echo | ls -a $HOME/films

else
echo "Il faut taper “oui” ou “non” et pas $ouinon "

exit 1

fi
exit 0[/code]

Mais du coup quand je tape “Z” ou non au début, il me demande quand même une lettre au lieu de passer au “elif ou au “else”. Je comprends toujours pas pourquoi… :think:
Et lorsque je donne la première lettre d’un fichier (ex : z) qui existe il me dit " ls: impossible d’accéder à /home/maxime/films/z* : Aucun fichier ou dossier de ce type” alors qu’il y en a un…

Oublie dans mon premier commentaire :
[ul]
[li]met un espace avant et après les [mono]=[/mono][/li][/ul]

Je n’interviendrai pas sur la programmation proprement dite, Michel le fera 10 fois mieux que moi.
MAIS
J’aimerais savoir à qui s’adressera ton script ?
Que tu le veuilles rédigé en Anglais, c’est un choix que je respecte bien que les miens, qui ne sont adressés qu’à moi, sont rédigés en Français, ma langue maternelle. Ce n’est ptet pas ton cas ?
Par contre, en aucune façon, un script ne doit être rédigé en FR pour partie et en GB pour une autre :

[mono]echo "Voulez les films commançant par une lettre particulière [Y/N] ?"
read ouinon[/mono]

Voulez-vous les films … = FR
Y/N = GB
read (lisez ???) = GB
ouinon = FR

Je ne parle pas des tournures de phrases ni des tas de raccourcis possibles dans la programmation.

EDIT :
Celui qui va utiliser ton script, est censé savoir à quoi il sert, donc le premier test me semble superflu.
Sinon, ça fait un peu penser au sketch de J-M Bigard : "c’est pour manger ? " … :smiley: -)
Il serait aussi bien de passer directement à :

“Film recherché”
“Entrez la première lettre du titre” $initiale (par exemple)

@ MisterFreez
Ok, je modifierai ça demain quand j’aurai le script sous la main :wink:

@Ricardo
Bah c’est plutôt un script “d’exercice” pour consolider et entretenir le peu de connaissances que j’ai en scripting. Donc au pire, il ne s’adresserait qu’à moi (en tout cas dans un premier temps).
Non non, ma langue maternelle c’est bien le français. Mais jusque là, j’ai toujours fait/vu/lu des scripts avec des [Y/N] ou des “read” j’avoue que je n’ai jamais pensé/essayé de mettre “lisez”. Mais j’pense pas que jusque là mes alternances FR/GB gêne tant que ça, si ?

Mais ta remarque de fin est tout à fait pertinente, je modifierai sans doute ça, une fois que j’aurai compris ce qui me fait planter pour le moment. :unamused:

Pour [mono]read[/mono] y’a pas trop le choix, c’est une commande…

Sinon dans ton cas précis, un [mono]case[/mono] serait plus adapté qu’une série de [mono]if[/mono] (et un petit [mono]tr[/mono] au passage pour t’éviter de te prendre le chou avec toutes les casses possibles) :

case "$(<<< "$ouinon" tr [:lower:] [:upper:])" in Y|YES|O|OUI) echo "oui" ;; N|NO|NON) echo "non" ;; *) echo "p'têt ben qu'oui, p'têt ben qu'non" ;; esac
Mais que ça ne t’empêche pas de chercher à comprendre ce qui déconne dans ton code actuel, ça te servira plus tard. :wink:

Accessoirement, les conventions habituelles en shell utilisent généralement des noms de variables touts en majuscule : [mono]$OUINON[/mono] plutôt que [mono]$ouinon[/mono].

Merci Syam pour les infos !
Je vais chercher et tester tout ça demain. Je reviendrai vers vous pour faire part de l’avancé. (même si à comparer les questions des autres posts, je me sens tout petit… :laughing: )

Un wiki dédié au Bash (en Anglais, mais si vous connaissez un équivalent en Français…) : mywiki.wooledge.org/BashGuide
Avec plein d’exemples :wink:

[quote=“agentsteel”]Un wiki dédié au Bash (en Anglais, mais si vous connaissez un équivalent en Français…) : mywiki.wooledge.org/BashGuide
Avec plein d’exemples :wink:[/quote]
Dans le genre “assez complet”, il y a ça :
http://abs.traduc.org/abs-fr/

Salaud ! :slightly_smiling: J’attendais qu’il arrive à corriger son script pour sortir des solutions (pécheur, poisson,…) !

Pour les noms de variables je préfère personnellement laisser les noms en majuscules pour les variables d’environnements et gérée par le shell ($REPLY par exemple).

Par contre je n’aime pas la syntaxe que tu utilise (je trouve pas ça très lisible), quitte à utiliser la puissance de bash :

shopt -s nocasematch
case "$ouinon" in
  Y|YES|O|OUI)
    echo "oui"
    ;;
  N|NO|NON)
    echo "non"
    ;;
  *)
    echo "p'têt ben qu'oui, p'têt ben qu'non"
    ;;
esac
shopt -u nocasematch

Ça n’est pas moins portables (même si je ne sais pas de quand date nocasematch et ta syntaxe) et ça économise un appel à un programme externe.

Bonne nuit

@ Agentsteel & Ricardo
Merci pour vos wiki, je sens que ça va bien m’aider !

Ce matin en faisant quelques modifications ça marche comme il faut !! :dance:

[code]#!/bin/bash

echo “Voulez les films commançant par une lettre particulière [O/N] ?”
read ouinon

if [ “$ouinon” = “o” ] || [ “$ouinon” = “O” ] || [ “$ouinon” = “oui” ] || [ “$ouinon” = “OUI” ] || [ “$ouinon” = “yes” ] || [ “$ouinon” = “YES” ];
then echo “Quelle est votre lettre ?”
read lettre
echo | ls -a -1 /home/maxime/films/"$lettre"* | more -d

elif [ “$ouinon” = “n” ] || [ “$ouinon” = “N” ] || [ “$ouinon” = “non” ] || [ “$ouinon” = “NON” ] || [ “$ouinon” = “no” ] || [ “$ouinon” = “NO” ];
then echo “Voici la liste de tous les films disponible :”
echo | ls -a -1 /home/maxime/films | more -d

else echo "Il faut taper “oui” ou “non” et pas $ouinon "
exit 1
fi
exit 0[/code]

Mais je vais regarder comment ça peut marcher avec “case”.

Merci beaucoup en tout cas ! :023

[quote=“MisterFreez”]Par contre je n’aime pas la syntaxe que tu utilise (je trouve pas ça très lisible), quitte à utiliser la puissance de bash :
[…]
Ça n’est pas moins portables (même si je ne sais pas de quand date nocasematch et ta syntaxe) et ça économise un appel à un programme externe.[/quote]
Perso je suis un peu allergique aux choses comme ça qui modifient le comportement globalement : ça fragilise énormément la composabilité, inutile de te faire des dessins.
Du coup l’appel à un programme externe me paraît très peu cher payé pour le contrôle que ça apporte sur la portée du comportement.

Quant à la syntaxe en elle-même, c’est une question de goût. Perso je trouve la redirection [mono]<<< “$VAR” commande[/mono] toute aussi lisible qu’un pipeline [mono]echo “$VAR” | commande[/mono] mais ça n’a que peu d’importance : en pratique je suis presque certain que ça exécute exactement la même chose dans les deux cas (mais si ça n’exécute pas le même code, je pense que la redirection a un léger avantage sur le pipeline).

[quote=“syam”][quote=“MisterFreez”]Par contre je n’aime pas la syntaxe que tu utilise (je trouve pas ça très lisible), quitte à utiliser la puissance de bash :
[…]
Ça n’est pas moins portables (même si je ne sais pas de quand date nocasematch et ta syntaxe) et ça économise un appel à un programme externe.[/quote]
Perso je suis un peu allergique aux choses comme ça qui modifient le comportement globalement : ça fragilise énormément la composabilité, inutile de te faire des dessins.
Du coup l’appel à un programme externe me paraît pas cher payé pour le contrôle que ça apporte sur la portée de la modif.[/quote]
C’est pas faux. Une autre solution serait de faire ainsi :

case "${ouinon^*}" in Y|YES|O|OUI) echo "oui" ;; N|NO|NON) echo "non" ;; *) echo "p'têt ben qu'oui, p'têt ben qu'non" ;; esac
C’est du bashisme, ça ne fait pas d’appel externe, ça ne modifie rien de global c’est lisible (la syntaxe ,/^ est l’une des rare que je trouve mieux foutu en bash qu’en zsh).

J’ai pas dis que ce n’étais pas une question de goût :slightly_smiling:
Par contre [mono]echo | commande[/mono] a l’avantage d’être POSIX (c’est pas anodin).

[quote=“MisterFreez”]C’est pas faux. Une autre solution serait de faire ainsi :

case "${ouinon^*}" in ...[/quote]
Ça tout de suite ça me va vachement mieux. :slightly_smiling:
Malheureusement je connais assez mal cette famille de manipulations, principalement parce que je les trouve totalement impossibles à retenir. :confused:

C’est zsh qui m’a formé à ça (voir l’exemple de mon apt-search¹). bash doit en avoir une quinzaine et zsh une trentaine et celles de zsh sont faciles à imbriquer (et certaines sont juste surpuissantes). Après pour s’en souvenir ben j’ai toujours le man avec moi elles sont regroupées et chercher ## permet d’y arriver rapidement :slightly_smiling: .

[1] : faudrait que je regarde si je peux virer la modif’ de l’IFS serait plus propre.

[quote=“ricardo”][quote=“agentsteel”]Un wiki dédié au Bash (en Anglais, mais si vous connaissez un équivalent en Français…) : mywiki.wooledge.org/BashGuide
Avec plein d’exemples :wink:[/quote]
Dans le genre “assez complet”, il y a ça :
http://abs.traduc.org/abs-fr/[/quote]
très bon :023
(on pourrait créer un topic sticky dans la rubrique, avec tous ces bons liens)