Apprentissage de script shell

Bonjour,
j’essaye d’apprendre du script shell je débute tout juste
Donc j’ai commencé a lire le tutoriel sur Lea-Linux et je continue en essayant de trouver des tutoriels
et aussi grace a mon ami man bash :slightly_smiling:

bref je voulais savoir si mon premier script shell était correct Voila
c’est pas bien terrible mais bon
et je ne comprends pas pourquoi il se ferme quand je met oui ???

[code]#!/bin/sh
#Script de renseignements par Antoine Martin - Dim 21 Sept 2008#

echo -n "Nous sommes le " 
date
echo -n "Voulez vous executez ce script ?(oui/non)"
read reponse

case $reponse in
	oui)
 		clear
 	echo -n "Pour commencer repondez a ces questions."
echo -n "Votre prenom est :"
read prenom
echo -n "Votre mot de passe est:"
read -s passe
echo -n "Votre prenom est $prenom et votre mot de passe est $passe."
echo -n "Le nom de votre kernel est " uname
echo -n "et sa version est   " uname -r
echo -n "Votre Distribution est $Hostname." 
echo -n "votre nom est  $users." 
echo -n "Votre repertoire courant est " pwd
echo -n "Votre Ordinateur est allumé depuis " uptime
echo -n "Votre adresse ip est la{execi 60 $wget -O - http://ip.tupeux.com | $tail}."
echo -n "c'est mal de donnez son identifiant et son mot de passe a un script et a quelqu'un que vous ne connaissez pas car je pourrais m'envoyer vos 		identifiants et mot de passe. ;)" ;;
	non)
 		fi;;
	*) echo "Erreur, vous deviez répondre par oui ou par non.";;
esac

[/code]

Merci bien de m’aider

On voit que tu débutes :wink: 2-3 choses :

-> evite au maximum les -e et -n à echo, ca passe pas sur tous les shells. Par défaut echo passe à la ligne, de même pour tout programme digne de ce nom.
-> tes appels de commandes c’est ce qu’il ne faut pas faire :wink:
-> mets des indentations :slightly_smiling:

Aller, une version un peu plus évoluée, avec des fonctions des pipes etc.

#!/bin/sh
#Script de renseignements par Antoine Martin - Dim 21 Sept 2008#


alerte() {
cat << EOF
C'est mal de donnez son identifiant et son mot de passe a un script et a 
quelqu'un que vous ne connaissez pas car je pourrais m'envoyer vos 
identifiants et mot de passe. ;)
EOF
}

monuptime() {
	uptime | awk {'print $3" jours, "$5" minutes" '} | 
	sed 's/:/ heure(s) et /g' | sed 's/,//g'
}

   echo "Nous sommes le $(date)"
   echo -n "Voulez vous executez ce script ?(oui/non)"
   read reponse

case $reponse in
	 oui)
	   clear
	   echo "Pour commencer repondez a ces questions."
	   echo -n "Votre prenom est :"
	   read prenom
	   echo -n "Votre mot de passe est:"
	   read -s passe
	   echo "Votre prenom est $prenom et votre mot de passe est $passe."
	   echo -n "Le nom de votre kernel est $(uname)"
	   echo " et sa version est $(uname -r)"
	   echo "Votre Distribution est $(cat /etc/debian_version)"
	   echo "Votre nom est  $(whoami)."
	   echo "Votre repertoire courant est $(pwd)"
	   echo "Votre Ordinateur est allumé depuis $(monuptime)"
	   echo "Votre adresse ip est la $(wget --quiet -O - http://ip.tupeux.com | tail)"
	   alerte	   
	   ;;
	 non)
	   exit
	   ;;
	 *) 
		echo "Erreur, vous deviez répondre par oui ou par non."
		;;
esac

Donc j’ai remarqué tu as crée une fonction alerte et monuptime

mais a quoi sert cat << EOF
c’est pour dire que le nombre de caractère est strictement inférieur a la Fin du fichier ( EOF = end of File c’est bien ça ?)

Pourquoi ce bout de code marche quand meme chez moi ??

et comment faire pour que une fois les information donnée cela reste un peu plus longtemps afficher ?

et il me demande pas le mot de passe et m’affiche a la place :read: 46: Illegal option -s

merci

[quote=“hyptos”]Donc j’ai remarqué tu as crée une fonction alerte et monuptime
mais a quoi sert cat << EOF[/quote]
En fait ça veut dire que jusqu’a temps qu’il n’y a pas en début de ligne, ça écrit le texte tel quel. Ca aide pas mal pour des messages d’aide en autre. J’ai mis EOF mais ca pourrait être BLABLABLA :wink:

[quote]
Pourquoi ce bout de code marche quand meme chez moi ??

echo "Nous sommes le" date

Ca marche peut être chez toi, mais ça marche pas chez moi :mrgreen: :

Toi t’utilises bash, c’est un shell parmi tant d’autres. Tu mets un sondage, tu verras que d’autres utilise ksh,csh,zsh,msh,fish (et plein d’autres), donc le but d’un bon script c’est d’être en accord avec le standard POSIX auquel tous les shells devraient se conformer (c’est loin d’être le cas :wink:)

2 possiblités :
[ul]
[li] man sleep[/li]
[li] Utilises read :wink:[/li][/ul]

Concernant le ‘read -s’ c’est normal, tu appeles sh qui doit être lié à /bin/dash, qui ne gère pas cette option (le -s est pas POSIX :p). En fait ça devrait être :

stty -echo
read passe
stty echo

Pour l’utilisation de sleep

cette commande est-elle correct du point de vu POSIX ?

ça marche ?? ( suis au bahut sans GNU/Linux ^^)

tiens d’ailleurs il existe un petit programme sous Windows exécutable depuis une clé (ou clef ?) usb qui émule une console ?? je vais chercher ça

C’est correct, pas de soucis à ce niveau la, c’est de toute manière une commande externe. Les commandes où tu dois faire attention sont celles affichées par la commande help dans ton shell.

Au mieux, si t’as pas trop envie de te poser de questions concernant la portabilité de ton script, tu peux installer le paquet devscripts qui contient checkbashism, un programme qui permet de déterminer ce qui n’est pas portable dans ton script, mais qui n’est pas parfait (fausses alarmes parfois). Mais c’est un gros paquet pour juste un programme utile :wink:

En fait c’est pas du tout ça. Chaque shell fait ce qu’il veut et c’est son droit le plus strict.
POSIX définie un shell de bout en bout (manière d’écrire les contrôles de flux inclut). Mais le seul shell qui s’attache à POSIX c’est sh, bash a une écriture proche des spécifications POSIX mais il ne l’ai pas.

Pour faire un script shell en POSIX la rêgle est toute bête :

Dans tout OS conforme POSIX, il existe un programme nomé sh dans /bin et qui est conforme lui même aux spécifications POSIX (généralement c’est un lien vers bash par exemple (oui il faut aussi savoir que si on appelle bash par la commande sh il va se conformer à POSIX et c’est le cas d’à peut près tout les shells)).

Je vois ce que tu veux dire, mais par contre j’ai du mal à comprendre pourquoi ceci :

#!/bin/sh
read -s entree
echo $entree

Ne mène pas à une erreur sur cette machine(sh est lié à bash chez moi), alors que l’autre où sh est lié à dash (qui est censé être compatible posix), ce code ne fonctionnera pas :wink:

La réponse est sûrement dans le debian/rules du paquet bash :wink:

Un petit lien sympa avec cours et exercices:

www-gtr.iutv.univ-paris13.fr/Cou … /tp03.html

Mais des fois dur à atteindre.

Merci Ludo pour le lien je le lirais (des que j’ai un temps)

Merci aussi a MisterFreez pour l’information mais je pense que tout mes petits scripts me seront destiné donc juste être sur que cela marche sur ma machine :stuck_out_tongue:

Merci a vous je reposterai si j’ai des petits problèmes ;o

Bonjour,
En émulateur de console Linux( Unix je ne garantie pas ) sous Windows tu as cygwin qui est sympa.

C’est celui que j’ai préféré ( après le système Linux lui même évidemment :wink: )