Bash basics
TODO in english.......
Objectif : automatiser des tâches
Fichier texte (attention a l'encodage)
Suite de commandes shell
Executable par un interpréteur
Retournant dans tous les cas une valeur (best practice)
code de bon fonctionnement
code d'erreur
différenciation des erreurs si possible !
Le shell
ensemble de commande et d'outil d'échange avec le système Ensemble de commandes
Exemple de shell:
bash : bourne again shell : shell GNU
csh, tcsh : shels proche du C de Berkeley
ksh : korn shell
...
Script élémentaires
#!/bin/bash
# un commentaire
echo "Salut les amis"
exit 0
avec les guillemets on interprete le contenu, et cela ne représente qu'une donnée
exit 0 = variable par défaut quand ça c'est bien passé
on retour 0 car il n'y a qu'un succès alors que les erreurs peuvent être multiples.
Pour rendre le script exécutable et le lancer :
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 sommes le " $(date)
exit 0
Les variables
Non typées, non déclarées
référencement de la valeur : $
variable en lecture readonly
exploitation des variables d'environnement
$USER
(nom current user),$PWD
(print work directory),$HOME
(chemin du home du current user)....Liste des variables d'environnement :
env
Exemple de variable
#!/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
Command
Description
$?
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
Les tableaux
Déclaration globale ou individuelle
tab = ("toto" "titi")
tab1[0] = "bob"
tab1[1] = "alice"
Pour l'affichage :
echo ${tab1[0]}
echo ${tab[@]}
@
affiche la totalité du tableau
Pour la taille : demande de la taille de la structure de données
echo ${#tab1[*]}
len= ${#tab1[*]}
Les tests
Deux syntaxes
test expression
[ expression ]
Tests sur les types de fichiers
Tests sur les valeurs ( chaînes, numériques )
Tests sur les fichiers
Command
Description
-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
Command
Description
expr1 –a expr2
Et
expr1 –o expr2
Ou
!
Expr Négation
Tests des valeurs
Chaine 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 conditionnelles if
if commande1
then
instructions
elif commande2
then
instructions
else
instructions
fi
#!/bin/sh
if [ $# -ne 1 ]
then
echo usage : $0 argument
exit 1
fi
echo Le paramètre est : $1
exit 0
Généralement on commence le script par vérifier if [ $# -ne 1 ]
pour vérifier si les paramètres correspondent.
Structure conditionnelles connaisse
case valeur in
expr1) commandes ;;
expr2) commandes ;;
...
esac
#!/bin/sh
case $# in
0) echo aucun paramètre ;;
1) echo 1 paramètre $1 ;;
2) echo 2 paramètres $1 - $2 ;;
3) echo 3 paramètres $1 - $2 - $3 ;;
esac
exit 0
#!/bin/sh
case $USER in
root) echo hello root ;;
olivier) echo bonjour olivier ;;
esac
exit 0
Structures itératives for
for variable [in liste]
do
commandes
done
#!/bin/sh
if [ $# -le 3 ]
then
echo au moins 4 arguments
exit 1
fi
echo Les paramètres sont :
for var in $*
do
echo $var
done
exit 0
#!/bin/bash
if [ $# -ne 1 ]
then
echo usage $0 repertoire
exit 1
fi
for f in $(ls $1)
do
if [ -f $1/$f ]
then
echo $f est un fichier
elif [ -d $1/$f ]
then
echo $f est un répertoire
fi
done
exit 0
Structures itératives while / until
While :
while [test]
do
commandes
done
#!/bin/bash
cpt=0
while [ $cpt -le 10 ]
do
echo "encore 1 : " $cpt
let cpt++
done
Until :
until [test]
do
commandes
done
#!/bin/bash
cpt=0
until [ $cpt -eq 10 ]
do
echo "encore 1 : " $cpt
let cpt++
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 d’un fichier
Lecture de la totalité d’un fichier dans une variable
Exploitation de cat
Exploitation de la redirection
#!/bin/bash
list=$(<toto.txt)
for element in $list
do
echo $element >> ./toto.txt
done
#!/bin/bash
list=$(cat toto.txt)
for element in $list
do
echo $element >> ./toto.txt
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
Les fonctions
Eléments de structuration de programmes
Pas toujours ( bien ) utilisées
Script souvent == programmation « sale »
Exploitation standard
Déclaration
Paramétrage
Appel
Les fonctions : déclaration et appel
#!/bin/bash
#déclaration
listFic(){
echo la liste des fichiers est :
ls -l
}
echo appel à la fonction
#appel
listFic
Les fonctions : 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 }
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=';'
echo $toto
for var in $toto
do
echo $var
done
echo "**************"
IFS=$oldIFS
echo $toto
oli;vier;toto
**************
oli vier toto
oli
vier
toto
**************
oli;vier;toto
IFS et fichiers
#!/bin/bash
affich(){
oldFS=$IFS
IFS=';'
for var in $1
do
echo $var
done
IFS=$oldIFS
echo
"---------
"
}
while read LINE
do
affich $LINE
done < mdp.txt
olivier;flauzac;azerty
florent;nolot;kkjgg
hacene;fouchal;pjhgbvc
olivier
flauzac
azerty
---------
florent
nolot
kkjgg
---------
hacene
fouchal
pjhgbvc
---------
Autour du réseau
Commandes réseau
Commandes respectant les protocoles réseau
Intégrable dans des scripts
Définition de l'ensemble des commandes
En ligne de commande
Dans des fichiers de configuration
Eléments définis
Adresse de destination
Fichier source
Fichier destination
login/motdepasse
...
WGET
Outil lié au requêtes
Téléchargement
Test d’existence (en HTTP on utilise le verbe HEAD)
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
wget –-spider URL
wget URL
wget –O fichier URL
wget –-continue –O fichier URL #
wget –-ftp-user=XXX –-ftp-password=YYY –O fichier URL #ftp avec login/motdepasse
wget –-limitrate=512k –O fichier URL #limiter le taux de telechargement
wget –-mirror –-convert-links –P ./dir URL #faire un site mirroir
wget –-user-agent= "xxx " –O fichier URL #changer le champs user-agent dans l'entete HTTP
0
Succès
1
Erreur générique
2
Parse error
3
Erreur d'ent
4
Erreur réseau
5
Erreur d’authentification SSL
6
Erreur d’authentification
7
Erreur de protocole
8
Erreur retournée par le 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 #sauvegarde sur le disque
curl –L http://www.toto.html #suivre les redirections
curl –c –o toto.html http://www.toto.com # -continue, reprends et continue un téléchargement si interrompue
curl --limit-rate 10MB –o toto.html http://www.toto.com
curl -z 15-Jan-19 –o toto.html http://www.toto.com # téléchargement uniquement si le fichier est plus récent que le 15 janvier 2019
curl –u login:password –o toto.html http://www.toto.com # possibilité de passer login et mdp
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 #passer des paramètres d'un formulaire
curl --data-urlencode "txt=ici un texte" http://addr/form.php
curl --cookie "cook=lecookie" http://addr/cook.php #rajouter un cookie dans l'entete
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 #donner explicitement les fichiers que l'on souhaite télécharger
Last updated
Was this helpful?