__ ___ _ _ _ ____ / / ___ / _ \__ _ _ _ ___ __| |_ _ | || ||___ \ / / / _ \ / /_)/ _` | | | / __| / _` | | | | | || |_ __) | / /__| __/ / ___/ (_| | |_| \__ \ | (_| | |_| | |__ _/ __/ \____/\___| \/ \__,_|\__, |___/ \__,_|\__,_| |_||_____| |___/
$> ls -l
-rwrw-rw- 1 db0 db0 62.1 Ko 2015-03-30 19:37 Impatient C
-rwrw-rw- 1 db0 db0 3.5 Ko 2015-03-30 19:37 Impatient SCM
-rwrw-rw- 1 db0 db0 3.0 Ko 2015-03-30 19:37 Impatient Emacs
-rwrw-rw- 1 db0 db0 2.4 Ko 2015-03-30 19:37 Impatient Man Pages
-rwrw-rw- 1 db0 db0 10.5 Ko 2015-03-30 19:37 Impatient Perl
-rwrw-rw- 1 db0 db0 17.3 Ko 2015-03-30 19:37 Impatient Python
-rwrw-rw- 1 db0 db0 13.6 Ko 2015-03-30 19:37 Impatient Shell Debutant
-rwrw-rw- 1 db0 db0 16.4 Ko 2015-03-30 19:37 Impatient Shell Script
-rwrw-rw- 1 db0 db0 3.4 Ko 2015-03-30 19:37 Impatient Shell
-rwrw-rw- 1 db0 db0 1.8 Ko 2015-03-30 19:37 Impatient Vim
Impatient Shell Script
Sommaire
- Fichier et execution
- Syntaxe
- Conditions et equivalences en C
- Tests sur des fichiers
- Commandes shell particulierement pratiques pour des shells scripts
- Autres commandes shell
- Exemples
- Exercices
- Corrections
Fichier et execution
- Extension .sh
- Droits d'execution 755 (+x) (chmod)
- Se lance avec ./mon_script ou sh mon_script
- Avec . mon_script, on lance le script directement dans le shell en court sans passer par un sous-processus.
- Lancer un script avec sh -x mon_script, on peut voir toutes les commandes que le script execute.
- Header :
Le path peut etre remplace par un autre shell (bash, tcsh, ksh, zsh, 42sh, ...).#!/bin/sh
- Les lignes commentees commencent par un #.
- On peut separer une commande sur plusieurs lignes grace au /.
- L'indentation n'a pas d'importante mais il faut faire attention aux espaces. On peut mettre des ";" en fin de ligne mais ca marche aussi sans.
Syntaxe
- Commandes shell les unes en dessous des autres.
Voir Impatient Shell Commands. - Les variables ont un $ devant quand on les utilise mais pas quand on
leur donne une assignation :
ma_variable=42 ma_chaine_de_caracteres="le pays du 42" echo $ma_variable echo $ma_chaine_de_caracteres
- On recupere le nom du script grace a $0.
- On recupere les arguments donnes en ligne de commande grace a $1, $2, $3,...
- On recupere le nombre d'arguments donnes en ligne de commande grace a $#.
- On recupere le PID grace a $$.
- On peut avoir un nombre aleatoire grace a $RANDOM
- La construction "si" se fait grace a la syntaxe suivante :
if [ condition ] then commande1 commande2 elif [ conditon ] then commande3 else commande4 fi
- La construction "executer tant que" se fait grace a la syntaxe suivante :
while [ condition ] do commande1 break continue commande2 done
- La construction "executer selon le cas" se fait grace a la syntaxe suivante :
case $nom_variable in valeur1) commande1 commande2 ;; valeur2) commande3 ;; *) commande_si_autre ;; esac
- La construction "tant que" avec incrementation se fait grace a la syntaxe suivante :
for nom_variable_dincrementation in valeur1 valeur2 ... do commande1 break continue commande2 done
- On peut declarer des fonctions grace a la syntaxe suivante :
nom_fonction() #declaration de la fonction { commande1 $1 $2 commande2 } nom_fontion "pays" 42 #appel de la fonction avec 2 args
- Verifier les valeurs de retours des commandes.
- Il vaut mieux quitter en indiquant si on a reussi ou echouer en utilisant exit (0 = ok / autre = echec)
- Avec bash comme shell, on peut faire des calculs avec la syntaxe suivante :
resultat=$(($variable1+3))
- En mettant eval devant une commande, le shell interprete les regexp avant d'executer.
Conditions et equivalences en C
Francais | C | Shell Script |
---|---|---|
expression1 et expression2 vraies | ((expression1) && (expression2)) | [ expression1 -a expression2 ] |
expression1 ou expression2 vraies | ((expression1) || (expression2)) | [ expression1 -o expression2 ] |
Longueur de la chaine de caracteres differente de zero | (strlen(string) != 0) | [ -n string ] |
Longueur de la chaine de caracteres egale a zero | (strlen(string) == 0) | [ -z string ] |
Chaine de caractere 1 egale a chaine de caractere 2 | (strcmp(string1, string2) == 0) | [ string1 = string2 ] |
Chaine de caractere 1 differente de chaine de caractere 2 | (strcmp(string1, string2) != 0) | [ string1 != string2 ] |
integer a egal integer b | (a == b) | [ a -eq b ] |
integer a superieur ou egal integer b | (a >= b) | [ a -ge b ] |
integer a superieur integer b | (a > b) | [ a -gt b ] |
integer a inferieur ou egal integer b | (a <= b) | [ a -le b ] |
integer a inferieur integer b | (a < b) | [ a -lt b ] |
integer a different integer b | (a != b) | [ a -ne b ] |
Tests sur des fichiers
Francais | Shell Script |
---|---|
Le fichiers existe | [ -e file ] |
Le fichiers n'existe pas | [ ! -e file ] |
Le fichiers existe et on peut lire | [ -r file ] |
Le fichiers existe et on peut ecrire | [ -w file ] |
Le fichiers existe et est executable | [ -x file ] |
Le fichiers existe et c'est un dossier | [ -d file ] |
---> Lire le man test pour plus de tests sur les fichiers.
UPCommandes shell particulierement pratiques pour des shells scripts
- echo
Affiche les arguments passes en parametres sur la sortie standard.
Remplace $NOM par les variables locales et d'environnements.echo "Bonjour $USER"
- printf
Fonctionne comme le printf en C avec une chaine formatee.age=42 printf "J'ai %d ans\n" $age
- cat nom_fichier
Affiche le contenu des fichiers passes en parametres. - sleep nombre_de_seconde
Attends le nombre de seconde indiques avant de continuer le script. - clear
Efface le contenu du terminal. - touch nom_fichier
Creer un fichier. - read NOM
Lit l'entree standard jusqu'a un "\n" et met son contenu dans la variable $NOM.echo -n "Entrez votre nom ici : " read nom_utilisateur
echo "Vous vous appelez $nom_utilisateur." - bc
Calculatriceecho "(42+(21*2))/2" | bc
- grep string
Garde uniquement les lignes qui contiennent string.echo "Informations sur mon compte :" cat /etc/passwd | grep $USER
- sed
Edition de ligne tres complet utilisant les regexp. - rev
Afficher en miroir.echo "srevne'l a elrap 24 ud syap eL" | rev
- sort
Affiche apres avoir trie par ordre ASCII. (A l'envers avec -r)echo "chenille\nmaison\narbre\nbuisson" | sort
- tr string1 string2
Change des caracteres (en utilisant des regexp).echo "JE NE VEUX PAS DE MAJUSCULES" | tr '[A-Z]' '[a-z]'
- cut
Selectionne seulement certaines parties de l'affichage. Fonctionne aussi avec des colonnes.echo "Liste des comptes utilisateurs :" cat /etc/passwd | cut -d':' -f1
- head
Affiche les 10 premieres lignes seulement. (nombre de ligne avec -n)cat mon_fichier | head -n 3
- tail
Affiche les 10 dernieres lignes seulement. (nombre de ligne avec -n)cat mon_fichier | tail -n 2
- wc
Affiche le nombre de lignes, de mots et de caracteres.echo "Nombre de comptes utilisateurs :" cat /etc/passwd | wc -l
- find
Fais des recherches de fichiers et eventiellement des actions dessus. (exemple) - dialog
Pratique pour faire de jolis menus. (exemple)
Autres commandes shell
Voir article Impatient shell.
UPExemples
Exemple simple de traitement des arguments :
#!/bin/sh
# Made by db0
# Contact db0company[at]gmail[dot]com
# Website http://db0.fr/
if [ $# -eq 2 ]
then
echo "J'ai deux arguments : " $1 "et" $2
elif [ $# -eq 1 ]
then
echo "J'ai un argument : " $1
else
echo "donne moi un argument !"
fi
Exemple de petit programme simple a comprendre qui propose 3 options dont une avec un petit jeu pour deviner un nombre et les deux autres pour faire des mini-fiches utilisateurs :
#!/bin/bash
# Made by db0
# Contact db0company[at]gmail[dot]com
# Website http://db0.fr/
# Fonctions
devine_nombre()
{
rand_number=$[ $RANDOM % 20]
search_number=0
echo "Cherche le nombre compris entre 1 et 20"
while [ $search_number -ne $rand_number ]
do
echo -n "Choisis un nombre : "
read search_number
tmp_nombre=$search_number
tmp_nombre=$[search_number+0]
if [ $search_number = $tmp_nombre ];
then
if [ $search_number -ne $rand_number ]
then
echo -n "Essaye encore "
if [ $search_number -gt $rand_number ]
then
echo "avec un nombre plus petit."
else
echo "avec un nombre plus grand."
fi
elif [ $search_number -eq $rand_number ]
then
echo "Bravo ! Le nombre etait bien $rand_number"
fi
else
echo "Tu m'as pas donne de chiffre, vilain"
search_number=0
fi
done
echo "Merci pour ce petit jeu."
}
fiche_user()
{
fiche_user="fiche_user_$1.txt"
# mettre le nom dans la fiche
echo "Nom : $1" > $fiche_user
# mettre le shell par defaut dans la fiche
result_grep=`grep $1 /etc/passwd`
if [ -z $result_grep ]
then
echo "L'utilisateur $1 n'existe pas"
rm -f $fiche_user
exit 1
fi
result_cut=`echo $result_grep | cut -d':' -f7`
if [ -n $result_cut ]
then
echo "Shell par defaut :" $result_cut >> $fiche_user
fi
# affichage de la fiche
echo "Fiche terminee :"
cat $fiche_user
}
# Recuperer le nom d'utilisateur dans la ligne de commande
if [ $# -eq 1 ]
then
echo "Bonjour $1"
else
echo "Attention tu as oublie de me dire ton nom comme argument."
exit 1
fi
# Demander l'option
echo "Option 1 : Jeu, Devine le nombre"
echo "Option 2 : Creer une fiche sur $1"
echo "Option 3 : Creer une fiche sur $USER"
echo -n "Quelle option tu choisis ? "
read option
case $option in
1)
devine_nombre
;;
2)
fiche_user $1
;;
3)
fiche_user $USER
;;
*)
echo "l'option n'existe pas"
exit 1
;;
esac
. .. ............;;. ..::::::::::::;;;;. [ Download ] . . ::::::::::::;;:' :'
Exercices
- Faire un script qui affiche le pid, le nombre d'argument et les arguments.
- Faire un script qui compte jusqu'a 10 en patientant une seconde entre chaque chiffre et qui affiche un joli ASCII Art a la fin du compteur.
- Modifier le script precedent pour y afficher le nombre de test de chiffre avant de trouver le bon.
- Modifier le script precedent pour que l'on puisse choisir la taille de random maximum du chiffre a deviner.
- Modifier le script precedent pour qu'il stocke le meilleur score dans un fichier et affiche le meilleur score a chaque fois qu'un utilisateur joue. Evidemment, si le score est battu, le fichier est modifie en consequence.
- Modifier le script precedent pour qu'il affiche d'autres infos dans la fiche sur l'utilisateur comme sa home(/etc/passwd), son id (/etc/passwd), son groupe, ...
Corrections
total 20 -rwxr-xr-x 1 dbzero users 267 Aug 6 11:54 print_pid_args.sh* -rwxr-xr-x 1 dbzero users 201 Aug 6 12:36 chrono.sh* -rw-r--r-- 1 dbzero users 128 Aug 6 12:33 ascii_art_file -rwxr-xr-x 1 dbzero users 2253 Aug 6 13:00 mon_premier_script_shell_modif1.sh* -rwxr-xr-x 1 dbzero users 2521 Aug 6 12:52 mon_premier_script_shell_modif2.sh*UP
Commentaires | Ajouter un commentaire