[bash] Problème de boucle

Résolu
aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention   -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

etant debutant en linux, je dois creer un petit script.
juste une invite prompt qui demande si l'utilisateur veut faire ceci ou cela.
et une boucle condition agissant en consequence.

j'ai donc fait sa :

#!/bin/bash
demande2=non

for liste in `ls /home/mimic/Bureau/packages/`
do
echo $liste
done

echo Taper 1 Pour installer le premier item, tapez 2 pour installer le deuxieme...
read choix

if [ $choix=="1" ]; then
#until [ $demande2="non"]; do
echo "Vous avez donc choisit Direct News en version pro ? [o/n]"
read conf

if [ $conf=='o' ]; then
echo "L'installation de unzip va demarrer pour verifier si le paquet est installé"
sudo apt-get install unzip
cd /home/mimic/Bureau/packages
unzip directnews-4.10.1-pro.zip -d /home/mimic/Bureau/packages/DirectNewsPro/
echo "Archive decompressé"
#$demande = 'oui'
$demande2= oui

#elif [ $conf='n' ]; then
#$demande = 'non'
#$demande2=oui

else
echo "Reponse indisponible"
$demande2 = non
fi
#done
fi

La j'ai commenté la boucle until pour pas qu'elle ne soit active.
mais j'ai quand meme mes if
seulement quand je repond 'n' pour 'non' dans mon terminal quand je lance mon script
il me fis quand meme ce qui figure dans le if [ $conf == 'o']

Comment faire pour que sa marche?
Configuration: Linux
Firefox 3.5.7

15 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    jp@MDK:~/tmpfs ssh$ ls rep/
    paquet1  paquet2  paquet3  paquet4
    
    jp@MDK:~/tmpfs ssh$ cat foo.sh
    #! /bin/sh
    
    #set -xv
    
    echo "Liste des paquets : "
    ls -1 rep/ | nl
    read -p "Choisissez le paquet à installer (entrez son numéro) : " choix
    nom="$(ls -1 rep/ | sed -n "${choix}p")"
    echo "Installation de ${nom} en cours..."
    
    jp@MDK:~/tmpfs ssh$ ./foo.sh
    Liste des paquets :
         1  paquet1
         2  paquet2
         3  paquet3
         4  paquet4
    Choisissez le paquet à installer (entrez son numéro) : 3
    Installation de paquet3 en cours...
    
    jp@MDK:~/tmpfs ssh$

    ;-))
    1
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    ls -1 rep/
    man ls pour plus d'explications.
    -1 Présenter un fichier par ligne

    |
    Pipe. On envoie le résultat de "ls -1" à travers un "pipe" (filtre) à la prochaine commande

    nl
    man nl. Afficher un fichier en numérotant ses lignes.

    nom="$(ls -1 rep/ | sed -n "${choix}p")"
    On récupère dans une variable le fichier correspondant au numéro choisi à l'aide de la commande "sed"
    1
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Il faut des espaces autour du signe "égale" !

    if [ "${conf]" == 'o' ]; then 

    0
  4. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    merci jipicy

    j'essai tout de suite
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    Sa ne marche pas, je met mon code en entier

    #!/bin/bash
    demande2=non

    for liste in `ls /home/mimic/Bureau/packages/`
    do
    echo $liste
    done

    echo Taper 1 Pour installer le premier item, tapez 2 pour installer le deuxieme...
    read choix

    if [ "$choix" == 'o' ]; then
    #until [ $demande2="non"]; do
    echo "Vous avez donc choisit Direct News en version pro ? [o/n]"
    read conf

    if [ "$conf" == 'o' ]; then
    echo "L'installation de unzip va demarrer pour verifier si le paquet est installé"
    sudo apt-get install unzip
    cd /home/mimic/Bureau/packages
    unzip directnews-4.10.1-pro.zip -d /home/mimic/Bureau/packages/DirectNewsPro/
    echo "Archive decompressé"
    #$demande = 'oui'
    $demande2= oui

    #elif [ $conf='n' ]; then
    #$demande = 'non'
    #$demande2=oui

    else
    echo "Reponse indisponible"
    $demande2 = non
    fi
    #done
    fi

    if [ $choix=="2" ]; then
    $demande2 = "non"
    #until [ $demande2="non"]; do
    echo "Vous avez donc choisit Direct News en version Open ? [o/n]"
    read conf

    if [ $conf=="o" ]; then
    echo "L'installation de unzip va demarrer pour verifier si le paquet est installé"
    sudo apt-get install unzip
    cd /home/mimic/Bureau/packages
    unzip directnews-4.10-open-20070618.zip -d /home/mimic/Bureau/packages/DirectNewsOpen/
    echo "Archive decompressé"
    $demande = "oui"
    $demande2= "oui"

    elif [ $conf=n ]; then
    $demande = "non"
    $demande2= "oui"

    else
    echo "Reponse indisponible"
    $demande2 = "non"
    fi
    #done
    fi
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    echo Taper 1 Pour installer le premier item, tapez 2 pour installer le deuxieme...
    read choix

    if [ "$choix" == 'o' ]; then


    Forcément la condition est toujours fausse ;-((
    0
  8. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    la honte j'ai mal recopier le code que tu m'avais donné (j'evite le copier coller quand j'apprend)
    j'essai et je dit le resultat que j'obtient
    0
  9. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    sa marche beaucoup mieux :)
    pourrait tu me dire ce que je pourrai faire pour optimiser mon script :
    j'utilise deux grandes boucles if avec les memes choses dedans
    je pourrai pas faire un for qui choisirait de faire tel instructions en fonction de tels choix
    par exemple :

    #!/bin/bash
    demande2=non
    i=0

    for liste in `ls /home/mimic/Bureau/packages/`
    do
    echo "$liste"
    done

    echo Taper 1 Pour installer le premier item, tapez 2 pour installer le deuxieme...
    read choix

    for liste in `ls /home/mimic/Bureau/packages/`
    do
    ///INSTRUCTION
    done

    exit;
    0
  10. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    relis ton code, tu met une valeur alphanumérique dans une variable, mais cette valeur n'est pas entre ""
    0
  11. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    merci du conseil
    0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Il y a quoi dans "/home/mimic/Bureau/packages/" ?
    S'il n'y a que 2 objets (apparemment connus d'avance), pourquoi faire un listing depuis une boucle ?
    0
    1. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
       
      C'est mon maitre de stage qui me demande sa
      pour me permettre de me familiariser avec le shell
      et proposer a des clients l'installations rapide des deux items connus dans ce repertoire (packages)
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
         
        S'il n'y a que 2 items, connus qui plus est, pourquoi s'embêter avec une boucle ?
        0
      2. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention   > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        c'est au cas ou on rajouterai plein d'autres archives dedans
        merci de tes reponses et d'essayer de m'aider :)
        0
  13. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    j'ai fait ce code...

    #!/bin/bash
    demande2=non
    i=1
    
    for liste in `ls /home/mimic/Bureau/packages/`
    do
    	echo "$((i++)) $liste"
    done
    
    echo Taper 1 Pour installer le premier item, tapez 2 pour installer le deuxieme...
    read choix
    
    i=0
    for liste in `ls /home/mimic/Bureau/packages/`
    do	
    	$((i++))
    	
    	if [ $choix == $i ]; then
    		echo $liste
    	else
    		continue
    	fi
    done
    
    exit;
    


    Mais sa me retourne un probleme :

    ./script.sh: line 16: 0 : commande introuvable
    directnews-4.10.1-pro.zip
    ./script.sh: line 16: 1 : commande introuvable

    Que faire ?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      0
  14. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    fait ;)
    0
  15. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    merci beaucoup c'est une bonne methode
    Pourrait tu juste m'expliquer ces lignes :

    ls -1 rep/ | nl

    et
    nom="$(ls -1 rep/ | sed -n "${choix}p")"
    0
  16. aymbob Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
     
    Je ne te remercierai jamais assez pour toutes ces informations precieuses qui me font progresser
    juste pour sa :

    nom="$(ls -1 rep/ | sed -n "${choix}p")"

    je ne comprend pas a quoi sert le p a la fin de la commande

    merci encore
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Le "p" fait partie de la syntaxe de "sed" et est conjointement lié à l'option "-n".

      En gros on demande à n'afficher que la ligne correspondant au motif (son numéro), afin de la récupérer dans la variable...

      Voir SED - les commandes

      Extrait :

      p print
      affichage (intervalle d'adresse autorisée)
      
          * Affiche à l'écran l'enregistrement courant (l'espace de travail). Elle n'efface pas l'espace de travail et ne modifie pas non plus le déroulement du script. Cette commande est toujours employée conjointement avec l'option "-n", sans quoi l'affichage de la ligne est dupliquée. (Préférer la seconde forme mieux adaptée du fait que le script s'achève dès que le motif ou la ligne rencontré est affichée sur la sortie standard sans continuer à parcourir le reste du fichier)
      0