[RESOLU] linux bash case

linux bash case [RESOLU] - Shell/Batch - Programmation

Marsh Posté le 17-05-2011 à 18:13:15    

Salut à tous,
Visiblement, j'ai un soucis de débutant et je tourne en rond  :??:  

Code :
  1. #!/bin/bash
  2. input=`zenity --width 640 --height 480 --title="MediaCenter" --text="Menu Principale" --list --radiolist --column="Choix" --column="Actions" TRUE "Tele" FALSE "Radio" FALSE "Internet" FALSE "Quitter"`
  3. ### Variable radio ###
  4. radio=`zenity --title="Les radios On-Line" --text="Menu Radio" --list --radiolist --column="Choix" --column="Radio" TRUE "Funradio" FALSE "Frequence_3" FALSE "Stop"`
  5. radio1=`zenity --title="Changer/arreter" --text="Menu Radio" --list --radiolist --column="Choix" --column="Actions" TRUE "Changer" FALSE "Quitter"`
  6. case $input in
  7.         Tele)
  8.                 echo "$input"
  9.         ;;
  10.         Radio)
  11.                 echo "$input"
  12.                 case $radio in
  13.                         Funradio)
  14.                                 if [ $radio1 == "Changer" ]
  15.                                 then
  16.                                         ### ici je voudrais pouvoir revenir sur la case input de la 3eme ligne ou 1 des variable radio au ligne 5 et/ou6 ????
  17.                                 fi
  18.                         ;; 
  19.                 esac
  20.         ;;
  21.         Internet)
  22.                 echo "$input"
  23.         ;;
  24.         Quitter)
  25.                 echo "$input"
  26.         ;;
  27.         -1)
  28.                 echo "$input"
  29.         ;;
  30. esac


 
J'avoue plus savoir et ma logique est apparemment perfectible  :ange:  
 
Vos propositions sont les bienvenues.
...


Message édité par pascal_1212 le 25-05-2011 à 17:57:22
Reply

Marsh Posté le 17-05-2011 à 18:13:15   

Reply

Marsh Posté le 18-05-2011 à 16:40:27    

Re à tous,
Personnes une idée pour que mon interface puisse ce promenner dans les différentes case ? Vers le haut, vers le bas etc.
Exemple : depuis la case Funradio vers Internet, etc.
 
...

Reply

Marsh Posté le 18-05-2011 à 17:40:37    

Pour l'instant, ton script affiche 3 boites de dialogue et récupère le choix de l'utilisateur dans 3 variables. Puis il traite les valeurs de ces variables.
 
Je ne suis pas un crack en bash, mais je pense que l'utilisation de fonctions peut résoudre en partie ton problème. L'idée est de mettre tes lignes 3, 5 et 6 dans 3 fonctions et d'appeler ces fonctions chaque fois que tu veux "rafraichir" une variable avec une nouvelle saisie utilisateur.
 
Par exemple pour la ligne 3, tu déclares :

Code :
  1. function fct_input() {
  2. input=`zenity --width 640 --height 480 --title="MediaCenter" --text="Menu Principale" --list --radiolist --column="Choix" --column="Actions" TRUE "Tele" FALSE "Radio" FALSE "Internet" FALSE "Quitter"`
  3. }


Puis juste avant le case de la ligne 8, tu appelles une première fois fct_input pour initialiser la variable "input".
A la ligne 19, tu n'as qu'un appel de fonction (une des 3 que tu as créées) à faire pour afficher la boite de dialogue que tu veux.


Message édité par shaoyin le 18-05-2011 à 17:41:10
Reply

Marsh Posté le 18-05-2011 à 19:35:22    

Te remercie shaoyin, l'idée est plus propre.
Mais sa régle pas le fait que je désire pouvoir me promener dans les case ?!
Si à la ligne 19 je mets :

Code :
  1. if [ $radio1 == "Changer" ]
  2. then
  3.       fct_input
  4. #    ./mon_script.sh
  5. fi


je réafiche l'input mais quand je choisis une action, dés lors, mon script s'arrête et pour ce cas présis une alternative est de le re appeler lui-même  :heink:  
Donc, ce promener dans les case est pas possible !
 
Je me souviens qu'en PHP, la fonction switch permettait cette manip :

Code :
  1. switch ($i):
  2. case 0:
  3.     echo "i = 0";
  4.     break;
  5. case 1:
  6.     echo "i égale 0";
  7.     break;
  8. default:
  9.     echo "égal à ...";
  10. endswitch;


 
Mais sa marche pas comme en php !?
...

Reply

Marsh Posté le 18-05-2011 à 22:51:09    

Non, je ne crois pas que ce soit possible en bash. A part utiliser une boucle while...
 
edit : J'ai écrit un peu rapidement hier soir. Je ne connais pas PHP, mais le peu que j'ai lu sur le "switch" me laisse à penser qu'il fonctionne exactement de la même façon que le "case" du bash. Ces mot-clés sont utilisés pour tester la valeur d'une variable sans passer par des "if - else" à répétition.
 
Pour moi, le bout de code que tu donnes sur "switch" est équivalent à :

Code :
  1. if ($i == 0)
  2. {
  3.     echo "i = 0"
  4. }
  5. elseif ($i == 1)
  6. {
  7.     echo "i égale 0";
  8. }
  9. else
  10. {
  11.     echo "égal à ...";
  12. }


Le test ne s'opère qu'une seule fois, et on ne revient pas en arrière.  
 
Pour ton problème, je pense que tu dois mettre ton bloc 'case' à l'intérieur d'une boucle 'while', dont tu ne sors que si la variable 'input' vaut "Quitter"


Message édité par shaoyin le 19-05-2011 à 10:02:31
Reply

Marsh Posté le 19-05-2011 à 17:28:17    

Te remercie shaoyin,
En effet, une fonction while do done est une solution fonctionnelle, je vais m'en contenter. Dommage de mobiliser de la ressource système pour une boucle qui attend Quitter  :hello:  
Une autre solution serai de charger les jets PHP (apt-get install php5 php5-cli) DEBIAN :sol: (cli pour command-line) mais ce serai remplacer une charge while par un jet qui tourne en tâche de fond, donc c'est plus du  :pt1cable: que du  :)  
Bon, je laisse le poste ouvert, je termine mon script et je le mettrais en guise de conclusion à valeur moyenne.
 
Dans tous les cas, merci à toi shaoyin pour tes pistes.
...

Reply

Marsh Posté le 19-05-2011 à 17:42:40    

Si je ne me trompe pas, tu dois rester bloqué dans un appel à zenity dans le while. Donc normalement tu ne devrais pas consommer de ressources.
 
Pour t'en assurer, tu peux lancer la commande "top" dans une autre console pendant que ton script tourne.

Reply

Marsh Posté le 25-05-2011 à 17:45:25    

Re à tous,
Voilà, je vous livre mon script. Il en est encore à un stade beta, mais on peut lui attribuer autant de fonction que l'on veut...
Dans un avenir proche une fonction rsync pour libérer de l'espace disque.
 
Donc, la vocation première de ce script est d'interfacer différentes fonctions pour en faciliter l'usage dans le cadre d'une becane de salon (MediaCenter) piloter par une zapette.
Si l'envie vous prend de l'optimiser, je suis prenneur  :love: je suis concient qu'il s'éloigne du titre du poste alors je vais le [RESOLU]

Code :
  1. #!/bin/bash
  2. #################################################################################################
  3. ### Ce script a pour but d'etre un moyen simple de piloter une becane de salon pour #############
  4. ### regarder la tele, lire un DVD, ecouter la radio on-line, surfer sur le net, lire les news ###
  5. ### et tous ce que vous pourrez y apporter comme complement ! ###################################
  6. ### Je vous le livre sans garentie, il a ete elabore/teste sur une Debian Squeeze 64 avec un ####
  7. ### gestionnaire de fenetres graph (OpenBox). J'espere que vous le ferez evoluer ? :) ###########
  8. ##################### 25 mai 2011 ###################################### pascal_1212@yahoo.fr ###
  9. #################################################################################################
  10. ### Begin fonction generale ### Menu principal
  11. function fct_input()
  12. {
  13. input=`zenity --width 640 --height 480 --title="MediaCenter" --text="Menu Principale" --list --radiolist --column="Choix" --column="Actions" TRUE "Tele" FALSE "DVD" FALSE "Radio" FALSE "Internet" FALSE "News" FALSE "Quitter" FALSE "Eteindre"`
  14. }
  15. ### End fonction generale #####
  16. ### Begin fonction radio ### Menu radio
  17. function fct_radio()
  18. {
  19. radio=`zenity --width 320 --height 240 --title="Les radios On-Line" --text="Menu Radio" --list --radiolist --column="Choix" --column="Radio" TRUE "RSR_1" FALSE "Espace_2" False "Couleur_3" FALSE "Stop"`
  20. }
  21. function fct_radio1()
  22. {
  23.  radio1=`zenity --width 320 --height 240 --title="Changer/arreter" --text="Menu Radio" --list --radiolist --column="Choix" --column="Actions" TRUE "Changer" FALSE "Quitter"`
  24. }
  25. ### End fonction radio #####
  26. ### Begin fonction Internet ### Menu arpenteur
  27. function fct_internet()
  28. {
  29. internet=`zenity --width 320 --height 240 --title="Aller sur Internet" --text="Confirmation" --list --radiolist --column="Choix" --column="Actions" TRUE "Oui" FALSE "Non"`
  30. }
  31. ### End fonction Internet #####
  32. ### Begin fonction Shutdown ### Extinction de la becane
  33. ### Le comptenu de cette fonction est reprise de (bertrand0) l'auteur, sur (http://forum.ubuntu-fr.org/viewtopic.php?id=244090) que je remercie au passge ###
  34. function fct_eteindre() # base sur un time out de 10 secondes
  35. {
  36. n=10;
  37. while ((n>=0));
  38. do
  39.  sleep 1;
  40.  let c=(10-n)*10;
  41.  echo $c;
  42.  echo "# Eteindre le MediaCenter dans $n secondes"
  43.  let n--;
  44.  done | zenity --width 320 --height 240 --window-icon=/home/pascal/icones/shutdown_1.png --progress --title="Exteindre !" --percentage=0 --auto-close; [ "$?" == 0 ] #  && sudo shutdown -r now
  45. }
  46. ### End fonction Shutdown #####
  47. fct_input #on initialise la variable generale
  48. while true ; #la boucle qui ecoute les commande user
  49. do
  50. case $input in #case du menu principal
  51. Tele)
  52.  echo message:"Regarder la TV" | zenity --notification --listen --window-icon="/home/pascal/icones/tux_tv.jpg" #info-bulle
  53.  echo "$input" #je ne suis pas encore decide regarder la tele avec VLC ou MPlayer
  54. ;;
  55. DVD)
  56.  echo message:"Lire un DVD" | zenity --notification --listen --window-icon="/home/pascal/icones/tux_noel.jpg" #info-bulle
  57.  echo "$input" #idem que menu tele
  58. ;;
  59. Radio) #Oui, c'est que des radios CH :)
  60.  echo message:"Ecouter les radios On-Line" | zenity --notification --listen --window-icon="/home/pascal/icones/tux_radio.png" #info-bulle
  61.  fct_radio #on initialise la variable radio
  62.  case $radio in #case du menu radio
  63.   RSR_1)
  64.    echo message:"Tu ecoutes RSR la 1er" | zenity --notification --listen --window-icon="/home/pascal/icones/tux_radio1.png" #info-bulle
  65.    fct_radio1 | `gnome-mplayer http://broadcast.infomaniak.ch/rsr-la1ere-high.mp3` #la version gnome de Mplayer est agreable, plutot qu'un ecran vide avec la radio qui defile en tache de fond :)
  66.     #ce qui suit (Changer/Quitter), j'aurai pu en faire une fonction :)
  67.    if [ "$radio1" == Changer ] #si on veut changer de canal
  68.    then
  69.     killall gnome-mplayer; #on kill le player et la boucle reinitialise
  70.    fi
  71.    if [ "$radio1" == Quitter ] #si on veut revenir au menu principal
  72.    then
  73.     fct_input #retour au menu principal
  74.    fi
  75.    ;;
  76.   Espace_2)
  77.    fct_radio1 | `gnome-mplayer http://broadcast.infomaniak.ch/rsr-espace2-high.mp3`
  78.    if [ "$radio1" == Changer ]
  79.    then
  80. #     fct_radio
  81.     echo "$radio1"
  82.    fi
  83.    if [ "$radio1" == Quitter ]
  84.    then
  85.     fct_input
  86.    fi
  87.    ;;
  88.   Couleur_3)
  89.    fct_radio1 | `gnome-mplayer http://broadcast.infomaniak.ch/rsr-couleur3-high.mp3`
  90.    if [ "$radio1" == Changer ]
  91.    then
  92. #     fct_radio
  93.     echo "$radio1"
  94.    fi
  95.    if [ "$radio1" == "Quitter" ]
  96.    then
  97.     fct_input
  98.    fi
  99.    ;;
  100.   Stop) #retour au menu principal
  101.    fct_input
  102.   ;;
  103.   -1) #gestion d'une erreur
  104.    fct_input
  105.   ;;
  106.  esac
  107. ;;
  108. Internet)
  109.  echo message:"Demarrage de FireFox" | zenity --notification --listen --window-icon="/home/pascal/icones/tux_firefox.png" #info-bulle
  110.  fct_internet #on initialise la variable
  111.  case $internet in
  112.   Oui) #je crois que c'est claire :)
  113.    /usr/bin/firefox
  114.    fct_input
  115.   ;;
  116.   Non) #retour au menu principal
  117.    fct_input
  118.   ;;
  119.   -1) #gestion d'une erreur
  120.    fct_input
  121.   ;;
  122.  esac
  123. ;;
  124. News)
  125.  echo message:"Lire les News on-Line" | zenity --notification --listen --window-icon="/home/pascal/icones/tux_news_wc.png" #info-bulle
  126.  # je ne suis pas encore decide, utiliser pan ou un autre lecteur de news
  127.  fct_input #retour au menu principal
  128.  exit 1;
  129. ;;
  130. Quitter) # quitter sans un shutdown, utile pour avoir une console si on en a besoin
  131.  echo message:"Quitter l'application sans eteindre !" | zenity --notification --listen --window-icon="warning" #info-bulle
  132.  exit
  133. ;;
  134. Eteindre)
  135.  echo message:"Arret du MediaCenter !" | zenity --notification --listen --window-icon="/home/pascal/icones/shutdown_1.png" #info-bulle
  136.  fct_eteindre
  137.  exit 1 ;
  138. ;;
  139. -1)
  140.  echo "$input" #gestion d'une erreur
  141.  exit 1 ;
  142. ;;
  143. esac
  144. done
  145. ### fin ###


 
Salut à tous.
Pascal

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed