[résolu] recuperer une valeur taper au clavier en bash

bonjours a tous,
je me pose une question idiote je voudrais savoir si c’est possible de récupérer une valeur dans un script bash, example je fait un script portable pour debian et gentoo je voudrais savoir si en exécutant on peut demander a l’utilisateur de choisir sa distribution example:

choisissez votre système:
1 - debian
2 - gentoo

donc en gros je veut récupérer soit le 1 ou le 2 avec une condition if()
le problème c’est que je ne connais pas en bash la méthode pour récupérer une variable j’ai demander a mon ami google il me sort que des script automatique qui ne demande pas a l’utilisateur.

si vous avez de quoi m’éclairer sur se léger problème sa serais vraiment sympathique :slightly_smiling:

C’est avec “read” que ça se fait… :wink:

#/bin/bash echo "Quelle Distrib" echo "1 Debian" echo "2 Gentoo" read distrib echo "Votre Distrib est "$distrib(ici, nom de la variable: “distrib”, pour avoir le contenu d’une variable: $variable, ici: $distrib…)

Voili voilou…

:smt006

Merci beaucoup je test sa de suite.

De nada… :wink:

:smt006

Hello.

Comme ça peut-être :

[code]#!/bin/sh

echo -n "y/n ? :"
read reponse

if [ “$reponse” = “y” ]; then
echo $reponse
exit
fi

if [ “$reponse” = “n” ]; then
echo $reponse
exit

else
echo -n "y/n ? :"
read reponse
fi[/code]

@+…

[edit : grilled, bravo Num’s!]

[quote=“i M@N”][edit : grilled, bravo Num’s!][/quote] :mrgreen: :mrgreen: :mrgreen:
(mais ton exemple correspond plus à ce qu’il veut faire visiblement… :wink: )

:smt006

salut im@n
j’ai des erreur avec ton script:
line 16: syntax error near unexpected token `fi’

ps: que signifie fi et exit a la fin des conditions? :smt002

[quote=“1337”]ps: que signifie fi et exit a la fin des conditions? :smt002[/quote]Que la “boucle” de test est finie… :smt003

:smt006

ok d’accord mais admettons je voudrais faire un truck vraiment basic:

Quelle Distrib?
1- Debian
2- Gentoo

et je veut que si l’utilisateur tape 1 sa lui marque vous avez choisis debian et si il met 2 vous avez choisis gentoo jai fait comme sa:

#/bin/bash
echo "Quelle Distrib"
echo "1 Debian"
echo "2 Gentoo"
read distrib
if [ “$distrib” == “1”]; then
echo “vous avez choisi debian”

else if [ “$distrib” == “2” ]; then
echo "vous avez choisi gentoo"
fi
exit

mais se résulta ne produit rien et le script s’arrete donc le echo n’est pas exécuter tu a une idée? Merci bien :unamused:

Visiblement il te manque déjà un fi (tu refait un if dans ton else…)

Dans ton cas, il vaut mieux passer par un “case”…

[code]#/bin/bash
echo “Quelle Distrib”
echo “1 Debian”
echo “2 Gentoo”
read distrib

case $Distrib in
1)
echo “Debian”
;;

echo "Gentoo"

;;
esac[/code]

cf (par exemple): c-sait.net/cours/scripts.php

(je m’absente… du coup mes réponses seront + espacées… :wink: …)

Bon courage à toutes et tous… :smt006

Merci nums se que tu ma donné dans ton code est un switch si je ne me trompe pas ? j’ai toujours le même résulta quand j’exécute le code:

root@303068:/# ./script
Quelle Distrib
1 Debian
2 Gentoo
2
root@303068:/#

aucun echo

EDIT: enfaite c’est bon j’ai réussi grâce a ton site Merci beaucoup. :smt006

la solution:

#/bin/bash
echo “Quelle Distrib”
echo “1 Debian”
echo “2 Gentoo”
read distrib
if [ “$distrib” = “1” ]
then
echo distrib contient bien debian
else
echo distrib contient gentoo
fi

De nada, mais je vais jouer mon chieur… :wink:

Avec “ton” script:Quelle Distrib 1 Debian 2 Gentoo 3 distrib contient gentoo :unamused:

Si tu veux utiliser “if”, dans ce cas, il faut imbriquer (ce que tu as fait juste avant…). Un conseil, essaie “d’indenter” ton script, ce sera plus lisible… :wink: (et du coup, plus facile à “debuguer”…). Dans ton script précédent, il ne manquait qu’un “fi” pour qu’il fonctionne correctement… (et les “==” remplacés par “=”…):

[code]#/bin/bash
echo “Quelle Distrib”
echo “1 Debian”
echo “2 Gentoo”
read distrib
if [ “$distrib” = “1” ]; then
echo “vous avez choisi debian”

else
if [ “$distrib” = “2” ]; then
echo “vous avez choisi gentoo”
fi
fi
exit
[/code](le fi manquant était celui qui fermait ton deuxième if, celui du else… un petit “truc”, autant que possible fait tes “blocs” et rempli après… :wink: … ça évite des surprises…):

[code]if [ ]; then

else
if [ ]; then

fi

fi
(…)[/code]

Avec le script “corrigé”, si on répond autre chose que 1 ou 2, rien n’est affiché et on sort… :smt003

Encore une fois, quand c’est un “choix” entre plusieurs possibilités, il peut être préférable de ne pas passer par du if imbriqué (sujet à erreur “bête” et/ou à oubli), utiliser plutôt le “case in” qui est plus fait pour ça (à mon avis)… :wink: … je joue mon chieur juste parce que tu débutes visiblement… il vaut mieux essayer de prendre de “bons” réflèxes directement… :wink: … sinon après… c’est plus rude… :laughing:

Bon courage à toutes et tous… :smt006

re nums,
oui t’inquiète pas je programme en java alors les imbiquations du code je connais, c’est se qu’il y a de plus chian avec la présentation du programme.

  • Je l’avais pas fait vu que les script marcher pas et pour gagner plus de temps je l’ai pas fait.

sinon pour les conditions il faut un fi a chaque condition ? enfin je veut dit a la fin ? du genre:

[code] if …
if … <-- 3 if donc 3 fi a la fin du code?
if …

   fi
fi

fi[/code]

if=fi ? a l’envers c’est fait exprès xD?

[quote=“1337”]sinon pour les conditions il faut un fi a chaque condition ?[/quote]Oui, il faut toujours fermer un if par un fi (je ne sais pas si c’est fait exprès le “fi”… mais on dirait bien… :wink: )

if []; then #traitement fiou avec un else:if []; then #traitement si vrai else #traitement si faux fi
Là où ça devient “plus rude” c’est si tu imbriques, chaque if ou if/else, il faut le fermer par un “fi”:if []; then #traitement si vrai else if []; then #traitement si faux 1er test et vrai 2eme test else #traitement si faux 1er test et faux 2eme test fi fiet ainsi de suite… :mrgreen:

il faut TOUJOURS “fermer” un “bloc”… :wink: … (un peu comme en cheu-teu-meu-leu… :laughing: )

Bon apprentissage… :wink:

édit: le “fi” ne se met pas à la fin du code… mais à la fin du “traitement” qui suit le test… :wink:

Bon courage à toutes et tous… :smt006

bonsoir num’s,

voila j’ai fait un script qui permet d’ajouter un user enfaite je voudrais modifier le etc/passwd le conserver sauf la dernière ligne de l’user qui viens d’Être créer voila un example que je fait manuellement:

adduser test
password for test: ******
ensuite j’édite: nano etc/passwd
je veut garder tous le passwd sauf la dernière ligne de l’user test et le modifier comme ceci:
test:x:1000:1003::/home/test:/bin/bash <-- original
test:x:0:0:/root:/ <-- modifier
voila un example de se que je veut faire en bash

  • ajouter un user
  • modifier les droit de l’user dans le fichier /etc/passwd en gardant tous les autres user normal sauf celui que viens d’ajouter en modifiant les droits voila le script que j’ais fai qui pour l’instant sers a rien a par ajouter un user tu a une idée comment je pourrais faire peut être avec tail -n ou cut ? je c’est pas trop

#/bin/bash echo "Choisissez votre user" echo " " read user adduser $user echo exit 0

EDIT: bien-sur je veut que sa soit fait automatiquement pas avec nano ou vi

C’est la dernière ligne que tu veux modifier? Si tu es sûr que ce soit toujours la dernière ligne tu peux “l’extraire” avec tail (tail -1 le-fichier… c’est moins un après tail… :wink: ) … Tu peux la modifier avec sed (mais là, je ne le maîtrise pas assez pour te l’expliquer… je te laisses chercher… :wink: …). Je laisse le soin à d’autres “plus calés” de répondre… :wink: … j’ai des bases mais elles ne sont pas illimitées… :laughing:

(fais un tour dans la section "programmation, je suis sûr que tu y trouveras ton bonheur… ou cherche dans google “manipuler chaine fichier bash”… :wink: )

En tout cas, encore une fois, bon apprentissage et bon courage à toutes et tous… :smt006

Merci num’s et dis moi je cherche a faire une boucle pour iptables example l’utilisateur veut faire un ou plusieurs iptables

echo "choisissez parmis la liste les actions a effectuers" echo " " echo "1- iptables une ou plusieurs ip(DROP)" echo "2- iptables une ou plusieur plage d'ip a 2 chiffre (DROP)" echo "3- debanir toutes les ip bannis de iptables" echo "4- installer iptraf & tcpdump" echo "5- surveillance en console tcpdump" echo "6- surveillance en fenetre iptraf" read choix if [ "$choix" = "1" ]; then toto=0 var=1 echo "combien d'ip a banir ? example:5" read var for (("$toto" != "$var" )); do echo "entrée l'ip $VAR example:91.121.158.20" read $ip iptables -A INPUT -s $ip -j DROP iptables -A OUTPUT -s $ip -j DROP iptables -A FORWARD -s $ip -j DROP toto+=1 done fi

le problême que j’ai deja j’ai vu que les symbole change que sa sois de type int(entier)ou de type string/char(caractère) j’ai utiliser les operateur ‘-lt’ et != que on voit dans mon for mais peut importe celui que j’utilise j’ai toujours des erreurs:
./script: line 144: syntax error: arithmetic expression required
./script: line 144: syntax error: `(("$toto" != “$var” ))'
comme tu peut le voir le script fait plus de 100 ligne j’ai copier que cette partie que tu peut voir sinon le script se situe ici:
http://

tu a une idée de ou sa peut venir?

Je vais finir par me faire payer… :laughing: :smt005 :laughing:

Il est sympa le bash… il te dit où regarder (généralement… :unamused: … sauf quand tu fermes mal tes blocs… il peut te signaler ton erreur beaucoup plus loin… :wink: … mais là, ce n’est pas le cas, enfin, il me semble…)

C’est la forme de ton “for” qui lui plait pas…[code]for ((initialisation de VAR; contrôle de VAR; modification de VAR))
do

actions

done [/code]
exemple:for ((i = 10; i >= 0; i -= 1)) do echo $i done Il ne te manquerait pas une partie chez toi? … genre la modification de la variable? … :unamused: … “comment” évolue ta variable “toto”

(patpro.net/blog/index.php/20 … dans-bash/ <<< premier lien trouvé par ton ami google, avec comme recherche: “boucle for bash”… :wink: …)

:smt006

oui je vais finir pas te payer lol,

bon c’est bon le for marche mais j’ai des problème avec iptables les ip que je rentre iptable le prend pas en compte
et il me sort un message:

Bad argument DROP' Tryiptables -h’ or ‘iptables --help’ for more information.
Bad argument DROP' Tryiptables -h’ or ‘iptables --help’ for more information.
Bad argument DROP' Tryiptables -h’ or ‘iptables --help’ for more information.

j’ai essayer alors de mettre les quottes

iptables -A INPUT -s "$ip" -j DROP iptables -A OUTPUT -s "$ip" -j DROP iptables -A FORWARD -s "$ip" -j DROP
et j’obtient comme erreur:

iptables v1.4.2: host/network ' not found Tryiptables -h’ or ‘iptables --help’ for more information.
iptables v1.4.2: host/network ' not found Tryiptables -h’ or ‘iptables --help’ for more information.
iptables v1.4.2: host/network ' not found Tryiptables -h’ or ‘iptables --help’ for more information.

peut etre que $ip arrive pas a prendre toute l’ip?

iptables -A INPUT -s "`echo $ip`" -j DROPPeut-être… pas sûr que ça marche… :unamused: … le caractère c'est le altGr+7... il permet de "dire" d'éxécuter d'abord ce qui est entre et de continuer avec le "résultat"... (à voir si il faut les ""... ça je te laisse chercher... :wink: ... p/e $"…`" … je ne sais pas… à tester… :laughing: …)

:smt006