100% ont trouvé ce document utile (1 vote)
165 vues47 pages

1 Scripting Bash

Le document décrit les scripts shell, qui sont des fichiers texte contenant des commandes shell exécutables par un interpréteur shell. Il présente les éléments de base des scripts shell comme les variables, les tests, les boucles et les fonctions.

Transféré par

yoyo
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
100% ont trouvé ce document utile (1 vote)
165 vues47 pages

1 Scripting Bash

Le document décrit les scripts shell, qui sont des fichiers texte contenant des commandes shell exécutables par un interpréteur shell. Il présente les éléments de base des scripts shell comme les variables, les tests, les boucles et les fonctions.

Transféré par

yoyo
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Scripting shell

M1 RÉSEAUX ET TELECOMS - RT0801


OLIVIER FLAUZAC
Scripts
Script shell
Fichier texte
Contenant une suite de commandes shell
Exécutable par un interpréteur
Retournant dans tous les cas une valeur
◦ Code de bon fonctionnement
◦ Code d’erreur
◦ Différenciation des erreurs !
Shell
Langage de commande et d’échange avec le système
Ensemble de commandes
Quelques shell
◦ bash : Bourne Again Shell : shell GNU
◦ csh, tcsh : shels proche du C de Berkeley)
◦ ksh : korn shell
◦ …
Scripts élémentaires
#!/bin/bash
# un commentaire
echo "Salut les amis"
exit 0

chmod u+x monScript.sh


./monScript.sh
Exécution d’une commande
Utilisation de $( ... )
Exploitation de la chaîne retournée
◦ Affichage
◦ Stockage

#!/bin/bash
echo "nous somme le " $(date)
exit 0
Les variables
Variables non types et non déclarées
Référencement de la valeur : $
Variable en lecture readonly
Exploitation des variables d’environnement
◦ $USER,$PWD,$HOME ...

Liste des variables d’environnement : env


var.sh
#!/bin/bash

variable="bonjour les amis"


echo $variable;

listeFic=$(ls)
echo $listeFic

echo Vous êtes : $USER


echo Répertoire d\'exécution : $PWD
echo Répertoire de base : $HOME
exit 0
Variables prédéfinies
$? valeur de sortie de la dernière commande
$0 nom du script
$n Nième argument passé au script
$# nombre d’arguments
$$ PID du processus courant
$* liste des arguments à partir de $1
Exemple : var2.sh
#!/bin/bash

echo "ce script s\'appelle" $0


echo "vous avez passé l’argument" $1
./var.sh
echo "la dernière commande a donné :" $?

exit 0
Opérations sur les variables
#!/bin/bash

var1=0
echo $var1 #0
let var1++
echo $var1 #1
let var1--
echo $var1 #0

var2=45
var2=$var2+359
echo $var2 #45+359

var3=4
var3=$(($var3+359))
echo $var3 #363

var4=7
var4=$[$var4+3]
echo $var4 #10
Tableaux
Déclaration globale ou individuelle

tab = ("toto" "titi")


tab1[0] = "bob"
tab1[1] = "alice"

Affichage
echo ${tab1[0]}
echo ${tab[@]}

Taille
echo ${#tab1[*]}
len= ${#tab1[*]}
Tests
Deux syntaxes
◦ test expression
◦ [ expression ]

Tests sur les types de fichiers


Tests sur les valeurs (chaînes, numériques)
Tests sur les fichiers

-e le fichier existe
-f c’est un fichier
-d c’est un répertoire
-r | -w | -x propriété du fichier
-s non vide
f1 –nt f2 Plus récent que
f1 –ot f2 Plus vieux que
Expressions logiques
expr1 –a expr2 Et
expr1 –o expr2 Ou
! Expr Négation
Test des valeurs
Chaines de caractères

-z / -n Chaîne vide / non vide


!= / n Différentes identiques

Valeurs numériques

-eq / -ne Égal / différent


-lt / -gt Strictement inférieur / strictement supérieur
-le / -ge Inférieur ou égal/ supérieur ou égal
Structure conditionnelle : if
if commande1 #!/bin/sh
then
instructions if [ $# -ne 1 ]
elif commande2 then
then echo usage : $0 argument
instructions exit 1
else fi
instructions echo Le paramètre est : $1
fi exit 0
Structures conditionnelles : case
case valeur in
expr1) commandes ;;
expr2) commandes ;;
...
esac

#!/bin/sh #!/bin/sh

case $# in case $USER in


0) echo aucun paramètre ;; root) echo hello root ;;
1) echo 1 paramètre $1 ;; olivier) echo bonjour olivier ;;
2) echo 2 paramètres $1 - $2 ;; esac
3) echo 3 paramètres $1 - $2 - $3 ;; exit 0
esac
exit 0
Structures itératives : for
for variable [in liste] #!/bin/bash
do if [ $# -ne 1 ]
commandes then
done echo usage $0 repertoire
exit 1
#!/bin/sh fi
if [ $# -le 3 ] for f in $(ls $1)
then do
echo au moins 4 arguments if [ -f $1/$f ]
exit 1 then
fi echo $f est un fichier
echo Les paramètres sont : elif [ -d $1/$f ]
for var in $* then
do echo $f est un répertoire
echo $var fi
done done
exit 0 exit 0
Structures itératives : while / until
while [test] until [test]
do do
commandes commandes
done done

#!/bin/bash #!/bin/bash
cpt=0 cpt=0
until [ $cpt -eq 10 ] while [ $cpt -le 10 ]
do do
echo "encore 1 : " $cpt echo "encore 1 : " $cpt
let cpt++ let cpt++
done done
La gestion des flux
En UNIX tout est fichier
Utilisation des flux
◦ < entrée standard depuis un fichier
◦ > ou 1> flux standard
◦ 2> flux d’erreur
◦ 2>&1 redirection de la sortie d’erreur vers la sortie standard

Redirection dans un fichier


◦ > écriture et création du fichier
◦ >> ajout à un fichier
Le cas du clavier
Ecriture de scripts interactifs
Lecture au clavier
Utilisation de read
Affectation d’un liste de variables

#!/bin/bash
read v1 v2 v3
echo "vous avez entré $v1"
echo "vous avez entré $v2"
echo "vous avez entré $v3"
Exploitation d’un fichier en sortie
Exploitation de la redirection
Ecriture avec echo dans le fichier

#!/bin/bash
list=$(ls)
for element in $list
do
echo $element >> ./toto.txt
done
Lecture d’un fichier
Lecture de la totalité d’un fichier dans une variable
◦ Exploitation de cat
◦ Exploitation de la redirection

#!/bin/bash #!/bin/bash
list=$(<toto.txt) list=$(cat toto.txt)
for element in $list for element in $list
do do
echo $element >> ./toto.txt echo $element >> ./toto.txt
done done
Lecture ligne à ligne
Utilisation de
◦ Boucle while
◦ read
◦ redirection

#!/bin/bash
cpt=1
while read LINE
do
echo $cpt ":" $LINE
let cpt++
done < toto.txt
Fonctions
Eléments de structuration de programmes
Pas toujours ( bien ) utilisées
Script souvent == programmation « sale »
Exploitation standard
◦ Déclaration
◦ Paramétrage
◦ Appel
Fonctions : déclaration et appel
#!/bin/bash

#déclaration
listFic(){
echo la liste des fichiers est :
ls -l
}

echo appel à la fonction


#appel
listFic
Fonction : paramètres
Pas de déclaration dans le prototypage
Exploitation des paramètres comme pour les scripts $1 , $2 …

#!/bin/bash

listFic(){
echo la liste des fichiers dans $1 est :
ls -l $1
}

echo Donnez le chemin à explorer :


read path
echo appel à la fonction
listFic $path
Travail sur les chaînes
Possibilité de réaliser des opérations spécifiques
◦ Extraction directe
◦ Modification du symbole délimiteur

Simplification des programmes


◦ Evite l’usage d’expressions régulières

Attention dans le cas des séparateurs


◦ Persistance de la modification
Extraction
Extraction
◦ Dans un chaine
◦ À partir d’un position
◦ Un nombre définit de caractères

${ chaine : position : nombre_de_caractères }

Troncature
◦ Dans un chaine
◦ Un nombre définit de caractères
${ chaine : nombre_de_caractères }
Extraction exemple

#!/bin/bash

chaine="salut à vous tous"


chaine2=${chaine:8:4}
echo $chaine #salut à vous tous
echo $chaine2 #vous

chaine3=${chaine:5}
echo $chaine3 #à vous tous
Notion de séparateur
Définition de la variable spéciale $IFS
Internal Field Separator
Utilisé pour effectuer les opérations standard de lecture
Valeur par défaut (configurable et dépendante du système)
◦ newline
◦ newline , tab , space

Redéfinition possible de l’IFS


◦ Permet le split implicite
Exemple
#!/bin/bash

oldIFS=$IFS
toto="oli;vier;toto"
echo $toto
echo "**************"
IFS=';' oli;vier;toto
echo $toto **************
for var in $toto oli vier toto
do oli
echo $var vier
done toto
echo "**************" **************
IFS=$oldIFS oli;vier;toto
echo $toto
IFS et fichier
#!/bin/bash olivier;flauzac;azerty olivier
florent;nolot;kkjgg flauzac
affich(){ hacene;fouchal;pjhgbvc azerty
oldFS=$IFS
---------
IFS=';’
for var in $1 florent
do nolot
echo $var kkjgg
done ---------
IFS=$oldIFS hacene
echo "---------" fouchal
} pjhgbvc
while read LINE
---------
do
affich $LINE
done < mdp.txt
Autour du réseau
Commandes réseau
Commandes respectant les protocoles réseau
Intégrable dans des scripts
Définition de l’ensemble des éléments de commandes
◦ En ligne de commande
◦ Dans des fichiers de configuration

Eléments définis
◦ Adresse de destination
◦ Fichier source
◦ Fichier destination
◦ Login / mot de passe
◦ …
Wget
Outil lié au requêtes
◦ Téléchargement
◦ Test d’existence

Permet
◦ De télécharger en ligne de commande
◦ D’intégrer le téléchargement dans les scripts

Permet «l’aspiration»
Exploitation des protocoles
◦ FTP
◦ HTTP
◦ HTTPS
Chargement et test
wget –-spider URL

wget URL
wget –O fichier URL
wget –-continue –O fichier URL

wget –-ftp-user=XXX –-ftp-password=YYY –O fichier URL

wget –-limitrate=512k –O fichier URL

wget –-mirror –-convert-links –P ./dir URL

wget –-user-agent= "xxx " –O fichier URL


Codes de sortie
0 Succès
1 Erreur générique
2 Parse error
3 Erreur d’entrée / sorti fichier
4 Erreur réseau
5 Erreur d’authentification SSL
6 Erreur d’authentification
7 Erreur de protocole
8 Erreur retournée par la serveur
Curl
Bibliothèque de requête pour les URL
◦ commande de transfert de et vers un serveur

Accès et création de ressource sur un serveur


◦ Exploitable en environnement REST

Protocoles supportés : FTP(S) , HTTP(S), SMPT(S), POP(S), IMAP(S), SCP, SFTP, SMB ...
Conçu pour fonctionner sans inter-actions
Basé sur libcurl
◦ intégration dans les langages de script
Utilisation HTTP
curl http://www.toto.com

curl –o toto.html http://www.toto.com

curl –L http://www.toto.html

curl –c –o toto.html http://www.toto.com

curl --limit-rate 10MB –o toto.html http://www.toto.com

curl -z 15-Jan-19 –o toto.html http://www.toto.com

curl –u login:password –o toto.html http://www.toto.com


Utilisation HTTP
curl –V http://www.toto.com

curl –I http://www.toto.com

curl –trace http://www.toto.com

curl –x http://www.toto.com

curl --data "txt=letexte" http://addr/form.php

curl --data-urlencode "txt=ici un texte" http://addr/form.php

curl --cookie "cook=lecookie" http://addr/cook.php


Utilisation FTP
curl –u ftpuser:ftppass –O ftp://ftp_server/file

curl –u ftpuser:ftppass –O ftp://ftp_server/

curl –u ftpuser:ftppass –T ./myLocalFile ftp://ftp_server/file

curl –u ftpuser:ftppass –T "{./myLocalFile1 , ./myLocalFile2} " ftp://ftp_server/file


Quelques scripts
Récupération d’informations sur un
utilisateur
Pas de paramètres
Création d’un fichier à chaque utilisation
Affichage et enregistrement
◦ de l’utilisateur
◦ l’id de l’utilisateur
◦ des groupes de l’utilisateur
Sauvegarde
Plusieurs paramètres
◦ le nom de l’archive
◦ nom du répertoire à sauvegarder
◦ adresse du serveur de sauvergarde
◦ login et password du compte

Archive réalisée avec tar


copie à travers du réseau de l’archive
Un script d’installation
Paramètres
◦ le nom de l’archive
◦ le répertoire de base d’installation

Vérification des existences et des droits


Test du type d’archive (zip, tar, tgz)
◦ Uniquement sur l’extension

Utilisation de l’archiveur

Vous aimerez peut-être aussi