logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 05-03-2015 22:42:42

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

bash, while, vlc et compagnie

Arf ! merci une fois de plus !!
Je suis en train de me faire un script :

#!/bin/bash

f=`ls /home/laurent/Vidéos`

read -p "Quel film lancer ? "

if [ -e /home/laurent/Vidéos/$REPLY ]
then 
  vlc /home/laurent/Vidéos/$REPLY
else
  echo "Le nom du film est faux. Appuyer sur <<Entrée>> pour voir la liste des films."
fi 

read
$REPLY="$f"
echo "Taper un mot clef du film sélectionné entouré de '*'. Par exemple : *fleuve*"
 


Arrivé là, j'aimerai que le shell revienne au début du script...
Euh... Je suis dans la bonne rubrique là non ? "Besoin d'explications complémentaires" ! big_smile
J'aurais peut-être dû l'appeler "chez Guizmo" !lol lol
Je précise que j'ai fait un essai avec for, j'ai laissé tombé, parcequ'à chaque fois que je fermais vlc, le script le relançait...

Dernière modification par Guizmo (05-03-2015 23:00:13)


Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#2 06-03-2015 05:01:08

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : bash, while, vlc et compagnie

Guizmo a écrit :

Euh... Je suis dans la bonne rubrique là non ? "Besoin d'explications complémentaires" ! big_smile
J'aurais peut-être dû l'appeler "chez Guizmo" !lol lol

Je vois que, de complément en complément, tu vas aboutir à la maîtrise totale de unix et tous ses descendants.  big_smile


I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#3 06-03-2015 09:57:19

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Je vais te proposer une solution à base de « while do done »
utilisant le petit mot clef « break » qui permet de sortir d'une boucle.
Ça sera bien pratique wink


#!/bin/bash

f=`ls /home/laurent/Vidéos`

while read -p "Quel film lancer ? "
do

    if [ -e /home/laurent/Vidéos/$REPLY ]
    then
        vlc /home/laurent/Vidéos/$REPLY
        break                                             # break permet de sortir de la boucle while
    else
        echo "Le nom du film est faux. Appuyer sur <<Entrée>> pour voir la liste des films."
    fi

    read
    $REPLY="$f"
    echo "Taper un mot clef du film sélectionné entouré de '*'. Par exemple : *fleuve*"
done
 



On peut encore améliorer, en utilisant l'option -e de read.  Ça permet
d'utiliser readline, et donc d'avoir une complétion, du coup plus besoin
d'afficher la liste des fichiers en cas d'erreurs. 
On peut faire comme suit :


#!/bin/bash

# on change de répertoire pour la complétion
cd /home/laurent/Vidéos

while read -e -p "Quel film lancer ? "
do

    if [ -e "$REPLY" ]
    then
        vlc "$REPLY"
        break
    else
        echo "Le nom du film est faux. Essayer la complétion avec la touche <TAB> pour avoir une liste de film"
    fi
done
 



Comme, on se positionne dans le répertoire des films, on peut réduire
les arguments du test -e et de vlc. J'ai mis la variable $REPLY entre
guillemets pour que les caractères d'espacement (espace, tabulation,…)
ne pose pas de problème.

Ce qui se passe quand un nom fichier contient un espace, c'est que
l'argument va être transmis comme deux chaines (ou plus) séparés au test
-e.  Comme le test -e est un test unaire (il ne prend qu'un argument),
bash va râler… Pareil, pour vlc, qui va voir deux arguments au lieu d'un
seul (enfin, normalement, il ne le verra jamais, car le test -e va échouer wink).
En entourant de guillemets la variable $REPLY on demande à bash de
tout transmettre en une seul chaine.

En fait, sans les guillemets tous les caractères d'espacements comme
les espaces, les tabulations et les caractères de nouvelle ligne vont
être supprimés

Ceci est dû au fait que bash découpe les arguments en se servant des
caractères d'espacement comme délimiteur. Pour t'en convaincre tu
essairas le code suivant :


echo les    espaces supplémentaires     vont    disparaître
echo "les   espaces supplémentaires     vont    rester"
 


Dans le premier cas, echo reçoit 5 arguments. Dans le second, il en
reçoit 1.

On peut même faire un petit script qui renvoie le nombre d'arguments
qu'on lui passe en ligne de commande :


#! /bin/bash

# renvoie sur stdout le nombre d'arguments passer sur la ligne de
# commande

echo "Le nombre d'arguments est : $#"
 



Si j'appelle ce sript : compte-arguments.bash :


bash compte-arguments.bash je suis content
 


affiche :


Le nombre d'arguments est : 3
 



Par contre :


bash compte-arguments.bash "je suis content"
 


affiche :


Le nombre d'arguments est : 1
 



Évidemment, tout ceci amène d'autres questions que je vais laisser en suspens pour l'instant wink

Dernière modification par enicar (06-03-2015 10:49:34)

Hors ligne

#4 06-03-2015 10:00:50

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : bash, while, vlc et compagnie

enicar a écrit :

que je vais laisser en suspens


Hitchcockien, n'est-il pas ? cool


saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#5 06-03-2015 10:02:05

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : bash, while, vlc et compagnie

big_smile

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#6 06-03-2015 10:50:56

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

@smolski c'est plutôt dans le style de « Rendez-vous avec X » tongue

Hors ligne

#7 06-03-2015 10:53:41

paskal
autobahn
Lieu : ailleurs
Inscription : 14-06-2011
Site Web

Re : bash, while, vlc et compagnie

lol

I'd love to change the world
But I don't know what to do
So I'll leave it up to you...

logo-sur-fond.png

Hors ligne

#8 06-03-2015 13:01:24

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

Je vois que, de complément en complément, tu vas aboutir à la maîtrise totale de unix et tous ses descendants.


À donf... cool lol
@enicar
Merci...
Alors ! big_smile
Je savais que les "" servaient à regrouper plusieurs arguments séparés par des espaces en un seul (je suis souvent obligé de les utiliser avec find ou cd), après je n'avais pas pensé à sa réaction avec echo qui supprime les espaces en trop... J'ai déjà vu qqu part stdin, stdout et stderr.
Ta première version est plus adaptée au contexte "d'utilisation" parce-que le nom du film n'est par tjs en début de ligne, du coup pour utiliser tab... Mais c'est très intéressant à savoir !
Peut-être qu'il existe une façon d'adapter ça à base d'expressions régulières... Ça complique pas mal les choses, mais je vais tenter de me tirer les cheveux là dessus cet AM ! smile (j'ai de sérieux doutes sur mes chances de résultats positifs tongue)
Un problème rencontré avec tab : tab me met un espace à la fin qui renvoie le script à

else
        echo "Le nom du film est faux. Essayer la complétion avec la touche <TAB> pour avoir une liste de film"


Si je supprime l'espace, ça lance le film sans pb...


Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#9 06-03-2015 17:05:39

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Le problème avec la complétion, c'est que ça rajoute un espace à la fin
de la chaine, en effet. Je ne sais pas si on peut lui demander de faire
autrement.
Je vois bien une solution. On teste si le fichier existe sinon
on essaye de supprimer un espace à la fin de la ligne, si il y en a un
on supprime l'espace et on teste à nouveau si le fichier existe. Comme ça,
on est sûr d'avoir géré les deux cas.

Ça donnerait quelque chose dans ce goût là :


if [ -e "$REPLY" ]
then
    vlc "$REPLY"
    break
else
    fichier="$(echo $REPLY|sed s/ \$//)"
    if [ -e "$fichier" ]
    then
        vlc "$fichier"
        break
    else
        echo "Le nom du film est faux. Essayer la complétion avec la touche <TAB> pour avoir une liste de film"
    fi
fi
 



Il te reste à l'intégrer dans ton script wink

Dans la substitution avec sed j'ai échappé le $ avec \ car sinon
bash va essayer de substituer une variable…
Sinon, c'est simple, je cherche si il y a un espace en fin de chaine.
Si oui, je le remplace par rien, en d'autres mots, on le supprime.
Si il n'y a pas d'espace à la fin, on ne fait rien.

Remarque, ce code risque de ne pas fonctionner si un nom de fichier
comporte un caractère nouvelle ligne… mais bon, ce n'est pas pratique
d'avoir des caractères nouvelles ligne dans les noms de fichiers,
n'est-ce pas ? wink

Dernière modification par enicar (06-03-2015 17:06:46)

Hors ligne

#10 06-03-2015 18:30:38

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

paskal a écrit :


Je vois que, de complément en complément, tu vas aboutir à la maîtrise totale de unix et tous ses descendants.


Pour la maîtrise totale d'unix, ça se fera sans moi, hein hmm

Hors ligne

#11 06-03-2015 20:42:43

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

J'avais pas vu cette réponse ! !
Je verrai ça demain, j' ai la tête comme une pastèque, je jette l'éponge pour ce soir !
Un grand merci enicar ! wink

Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#12 07-03-2015 08:09:10

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Guizmo a écrit :

Je savais que les "" servaient à regrouper plusieurs arguments séparés par des espaces en un seul (je suis souvent obligé de les utiliser avec find ou cd), après je n'avais pas pensé à sa réaction avec echo qui supprime les espaces en trop...



D'abord, on peut se servir aussi des simples quotes. La différence
par rapport aux guillemets, c'est que bash ne fera pas la $ substitution,
pour les variables par exemple. En résumé, avec les simples quotes, bash
ne fait aucune substitution, avec les guillemets, on peut insérer la valeur de variable
(en utilisant $var, tout simplement) ou le résultat de sortie de commande (avec $( ) ).

Ensuite, ce n'est pas echo qui supprime les espaces, mais c'est bash.
Bash analyse chaque ligne qu'on lui passe, et fait diverses substitutions,
comme les alias, les variables, les substitutions résultant de commande
(comme avec les apostrophes inverses ou $(cmd )). C'est bash aussi qui
interprète les « glob », c'est à dire les motifs du shell, du style *.txt, etc…

Je ne connais pas l'ordre de toutes ses transformations. Ça ne pose pas de
problème en général, mais il faut savoir que bash le fait dans un certain ordre.

Dernière modification par enicar (07-03-2015 08:12:15)

Hors ligne

#13 08-03-2015 03:34:55

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Tiens, j'en profite pour mettre le doigt sur erreur courante.
Dans ton script, tu fais :


f=`ls /home/laurent/Vidéos`
 


Cette façon de faire est très mauvaise. Ça consomme des ressources
système non nécessaire pour une opération aussi simple (notamment
des descripteurs de fichiers).

La bonne façon de faire est :


f=/home/laurent/Vidéos/*
 


Ici, on n'utilise l'expansion des motifs du shell (appelés « glob »). Donc on ne lance
pas de nouveau processus et on utilise pas de descripteurs de fichiers supplémentaires.

Hors ligne

#14 08-03-2015 09:49:13

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

En fait, le résultat n'est pas tout à fait le même. Quand on utilise ls, ls va supprimer
le nom complet du répertoire /home/laurent/Vidéos pour n'afficher que le contenu
de ce répertoire.


Par contre /home/laurent/Vidéos/* va être expansé avec le chemin complet pour
chaque nom de fichier.


Un exemple illustrera bien mieux tout cela. Admettons que nous ayons un
répertoire /dir/, qui contient deux fichiers nommé 1 et 2 :


f=$(ls /dir/)
echo $f
 


affichera :


1 2
 



Par contre :


f=/dir/*
echo $f
 


affichera :


/dir/1 /dir/2
 



On peut obtenir le même résultat  avec la seconde méthode qu'avec la première
en changeant le répertoire courant :


cd /dir/
f=*
echo *f
 


affichera


1 2
 

Hors ligne

#15 14-03-2015 18:54:41

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Bon, à présent, on va pouvoir revenir sur un autre erreur de débutant.
La ligne :


$REPLY="$f"
 


est probablement fausse. En effet, si l'on veut faire une affectation, il suffirait de faire :


REPLY="$f"
 


Ce qui n'affiche pas la liste des fichiers contrairement au résultat désiré. Le $ sert à faire
la substitution de la variable par la valeur qu'elle contient. Quand on veut juste fixer la
valeur d'une variable, on n'utilise pas le $ devant le nom de cette variable (contrairement
à d'autres langages comme perl wink).

Pour afficher la liste des fichiers il suffit de faire un « ls » ! Pas besoin
de stocker ce résultat dans une variable ou dans un fichier puisqu'on veut
juste afficher le résultat du « ls ». Et bien, faisons donc juste un « ls ».
Je propose la version suivante :


#!/bin/bash

while read -p "Quel film lancer ? "
do

    if [ -e /home/laurent/Vidéos/$REPLY ]
    then
        vlc /home/laurent/Vidéos/$REPLY
        break                                            
    else
        echo "Le nom du film est faux. Appuyer sur <<Entrée>> pour voir la liste des films."
    fi

    read
    ls /home/laurent/Vidéos/
    echo "Taper un mot clef du film sélectionné entouré de '*'. Par exemple : *fleuve*"
done
 


En plus, il n'y a plus besoin de $(ls …). J'avais bien dit que cette façon de faire était mauvaise. wink

Hors ligne

#16 14-03-2015 21:37:39

sogal
Black Metal Modo
Lieu : Nord Isère
Distrib. : openSUSE Leap 42.3
Noyau : Linux 4.4.76
(G)UI : GNOME
Inscription : 09-05-2013
Site Web

Re : bash, while, vlc et compagnie

Salut,
Pour éviter d'avoir à écrire le nom du film, l'instruction select peut t'être utile:

select film in ~/Vidéos/*; do mplayer "$film" ; done


me renvoie par exemple:

1) Vidéos/film1.mkv
2) Vidéos/film2.mkv
3) Vidéos/film3.mkv
#?


Je tape 1 suivi de Entrée et ça me lance le film1.mkv dans mplayer.

Tu peux personnaliser le prompt en ajoutant au début:

PS3="Quel film regarder ? "


Ce qui remplace "#?" par l'invite "Quel film regarder ?"


1485418338.png Hello IT ! Have you tried turning it off and on again ?

Hors ligne

#17 14-03-2015 23:36:28

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Très bien le select wink

Hors ligne

#18 15-03-2015 16:29:08

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

Merci à vous 2 !
Je ne sais pas si c'est normal que lorsque que je fais :

f=/home/laurent/Vidéos/*
echo $f


Ma liste apparaît en bloc sans retour à la ligne (mais avec des espaces et sans \n cette fois wink )
Sinon pour select : c'est une boucle?
Si c'est non : Peut-on l'intégrer dans une boucle ?

sogalpunx a écrit :

PS3="Quel film regarder ? "

Ce qui remplace "#?" par l'invite "Quel film regarder ?"



Je n'ai pas ce problème "#?" avec "read -p"...
ceci dit c'est plus court à écrire smile


Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#19 15-03-2015 16:38:08

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

D'accord !
je viens de tester

select film in ~/Vidéos/*; do mplayer "$film" ; done


effectivement le prompt est "#?"
Et manifestement c'est une boucle puisque lorsque que je ferme vlc (chez moi) l'invit "#?" revient...

Dernière modification par Guizmo (15-03-2015 16:40:32)


Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#20 15-03-2015 16:48:55

sogal
Black Metal Modo
Lieu : Nord Isère
Distrib. : openSUSE Leap 42.3
Noyau : Linux 4.4.76
(G)UI : GNOME
Inscription : 09-05-2013
Site Web

Re : bash, while, vlc et compagnie

Bonjour,
Oui c'est une boucle, si tu veux sélectionner un film, le regarder et basta:

PS3="Quel film regarder ?" ; select film in $HOME/Vidéos/* ; do mplayer "$film" ; break ; done


1485418338.png Hello IT ! Have you tried turning it off and on again ?

Hors ligne

#21 15-03-2015 16:52:10

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Guizmo a écrit :


Je ne sais pas si c'est normal que lorsque que je fais :


f=/home/laurent/Vidéos/*
echo $f
 


Ma liste apparaît en bloc sans retour à la ligne (mais avec des espaces et sans \n cette fois wink)



C'est normal ; je t'ai déjà donné tous les éléments pour répondre à cette question…


Essaye, avec des guillemets :


f=/home/laurent/Vidéos/*
echo "$f"
 


pour voir…

Dernière modification par enicar (15-03-2015 16:53:33)

Hors ligne

#22 15-03-2015 16:58:05

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

echo "$f"


me renvoie

/home/laurent/Vidéos/*


Sinon je n'avais rien toucher au retour de shopt, nullglob est tjs sur off...

Dernière modification par Guizmo (15-03-2015 17:03:31)


Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#23 15-03-2015 16:59:32

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

Sinon c'est pas bien d'utiliser "select" dans un script genre de rajouter un if, ou autre ?

Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

#24 15-03-2015 17:03:07

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : bash, while, vlc et compagnie

Ta question n'est pas claire.

Hors ligne

#25 15-03-2015 17:05:40

Guizmo
Membre
Lieu : Mello dans l'Oise
Distrib. : Jessie
Noyau : Linux 3.2.0-4-686-pae
Inscription : 03-02-2015

Re : bash, while, vlc et compagnie

Est-ce que l'on peut intégrer "select" "do" dans un script en l'intégrant dans un "while" ou en lui ajoutant un "if" ?

Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci smile

Hors ligne

Pied de page des forums