[bash] Problème de boucle
Résolu
aymbob
Messages postés
147
Date d'inscription
Statut
Membre
Dernière intervention
-
jipicy Messages postés 40842 Date d'inscription Statut Modérateur 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?
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?
A voir également:
- [bash] Problème de boucle
- Bingo bash - Télécharger - Divers Jeux
- Bash addition - Forum Shell
- Additionner deux réels en shell ✓ - Forum Shell
- Télé samsung s'éteint et se rallume en boucle - Forum Téléviseurs
- Tv orange chargement en boucle ✓ - Forum TV & Vidéo
15 réponses
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$
;-))
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"
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"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
#!/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
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 ;-((
read choix
if [ "$choix" == 'o' ]; then
Forcément la condition est toujours fausse ;-((
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
j'essai et je dit le resultat que j'obtient
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;
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;
relis ton code, tu met une valeur alphanumérique dans une variable, mais cette valeur n'est pas entre ""
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 ?
S'il n'y a que 2 objets (apparemment connus d'avance), pourquoi faire un listing depuis une boucle ?
j'ai fait ce code...
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 ?
#!/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 ?
merci beaucoup c'est une bonne methode
Pourrait tu juste m'expliquer ces lignes :
et
Pourrait tu juste m'expliquer ces lignes :
ls -1 rep/ | nl
et
nom="$(ls -1 rep/ | sed -n "${choix}p")"
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
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
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 :
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)