Introduction aux scripts BASH
Préliminaire
Grâce aux remarques suivantes vous pourrez rédiger une version électronique
de ce T.P. que je dois récupérer.
Remarque 1
Echange de données entre la machine virtuelle et la machine physique.
Créer le répertoire
PartageVM sur la machine physique, dans
le répertoire Dossier Personnel.
Dans VirtualBox choisir la machine DebianMe puis dans la partie centrale
sélectionné
Shared , ensuite cliquez sur l'icône dossier avec un +.
Sélectionné le dossier
PartageVM.
Cochez les options :
Automount et
Make permanent
Validez.
Sur la machine virtuelle, dans le répertoire /media créer un autre répertoire
partage.
Ensuite il reste à monter ce dossier partage vers le dossier Partagé de la machine physique,
vous allez réaliser ceci grâce à la commande :
mount -t vboxsf PartageVM /media/partage
Vérifiez que le partage fonctionne dans les deux sens.
Remarque 2
Voici comment récupérer le résultat des commandes pour les insérer dans un fichier,
qui ensuite pourra être utilisé dans un traitement de texte de la machine physique.
Par exemple :
ls -al >> fichier.txt
Le simple chevron crée un fichier ou efface le précédent fichier,
alors qu'un double chevron ajoute au fichier déjà existant.
Ensuite il vous suffira de déplacer le fichier vers le répertoire de partage
pour y accéder de la machine physique :
mv fichier.txt /media/PartageVM/
Un script
bash est un fichier de type texte qui contient des commandes.
Ce fichier peut-être exécuté comme une seule commande par l'interpréteur (le programme /bin/bash).
Dans le
bash il est possible de gérer des variables, de passer des paramètres,
de récupérer le contenu de certaines variables systèmes,
d'utiliser des structures conditionnelles et itératives ...
Remarques :
- Le script commence en général par #!/bin/bash
C'est le chemin vers l'interpréteur
bash
- Le symbole # débute une ligne de remarque, n'hésitez pas à en faire un usage abondant.
Premier exemple :
#!/bin/bash
# script bonjour
# donne le bonjour à l'utilisateur qui l'a lancé
# la variable d'environnement $USER contient le nom du login
echo --------- Bonjour $USER ----------
# l'option -n empêhe le passage à la ligne
# le ; sert de séparateur des commandes sur la ligne
echo -n "Nous sommes le "; date
# recherche de $USER en début de ligne dans le fichier passwd
# puis extraction de l'UID au 3ième champ et affichage
echo "Votre numéro d'utilisateur est " $(grep "^$USER" /etc/passwd | cut -d: -f3)
Pour que le script soit exécutable, il faut le rendre exécutable.
chmod a+x go1
si le script se nomme
go1
Pour lancer le script, saisissez
./go1
Si les scripts personnels sont toujours stockés au même endroit, par exemple
/home/bin, vous pouvez ajouter ce chemin dans le
PATH.
Pour cela, il vous suffit d'ajouter la ligne suivante dans votre fichier
.bashrc,
qui est présent dans chaque répertoire utilisateur et qui permet d'affiner
le profil personnel du shell de chaque utilisateur.
ATTENTION, ce chemin ne sera pris en compte qu'une fois déconnecté puis reconnecté.
Second exemple :
#Appel du script : ./bonjour nom prenom
if [ $# = 2 ]
then
echo "Bonjour $2 $1 et bonne journée !"
else
echo "Syntaxe : $0 nom prenom"
fi
Communication entre le shell (bash) et la console.
- echo, affiche son argument texte entre guillemets sur la sortie standard, c'est à dire l'écran.
La validation d'une commande
echo provoque un saut de ligne.
On peut insérer les caractères spéciaux habituels, qui seront interprétés seulement si l'option
-e suit la commande
echo
Caractères spéciaux :
\n (saut ligne), \b retour arrière), \t (tabulation), \a (alarme), \c (fin sans saut de ligne)
Troisième exemple :
echo "Bonjour \nà tous !"
echo -e "Bonjour \nà tous !"
echo -e "Bonjour \nà toutes \net à tous ! \c"
read, permet d'affecter les valeurs lues au clavier (entrée standard)
read var1 var2 ...
Attend la saisie au clavier d'une liste de valeurs puis les affecte, après validation, respectivement aux variables var1, var2 ...
Quatrième exemple :
echo "Donnez votre prénom et votre nom"
read prenom nom
echo "Bonjour $prenom $nom"
Les variables
BASH
On distingue les variables systèmes et vos variables.
Syntaxe :
variable=valeur
ATTENTION ! le signe
= ne doit pas être entouré d'espaces.
On peut initialiser une variable à une chaîne vide :
chaine_vide=
Si
valeur est une chaine avec des espaces ou des caractères spéciaux, l'entourer de
" " ou de
' '
Le caractère
\ permet de masquer le sens d'un caractère spécial comme
" ou
'
Exemple :
- chaine=Bonjour à tous
- echo $chaine
Pour faire référence à la valeur d'une variable, la faire précéder du symbole
$
Pour afficher toutes les variables
set
Pour empêcher la modification d'une variable, utiliser la commande
readonly
Substitution de variables :
Si une chaîne contient la référence à une variable, le shell doit d'abord remplacer cette référence par sa valeur avant toute chose.
Cela est effectué par l'utilisation de
" " qui est obligatoire dans ce cas à la place de
' '
Exemple :
n=123 ;
echo "la variable \$n vaut $n"
salut="bonjour à tous !"
echo "Alors moi je dis : $salut"
echo 'Alors moi je dis : $salut'
echo "Alors moi je dis : \" $salut \" "
readonly salut
salut="bonjour à tous, sauf à toto"
echo "Alors moi je dis : $salut"
Toute variable est défini dans un seul shell.
Pour qu'elle devienne globale elle doit être exportée grâce à la commande
export variable
La commande
export seule permet d'obtenir la liste des variables exportées.
Opérateur {} dans les variables
Dans certains cas, on peut être amené à utiliser des noms de variables dans d'autres variables.
La présence de
{ } force l'interprétation des variables incluses.
Voici un exemple :
user="/home/stage"
echo $user
u1=$user1
echo $u1
# --> ce n'est pas le résultat escompté !
u1=${user}1
echo $u1
Les variables d'environnement.
Ce sont des variables systèmes dont la liste est consultable par la commade :
env | less
Quelques-unes de ces variables : $PATH, $USER, $PS1, $SHELL, $ENV, $PWD
Un exemple :
[toto@amphi toto]$ moi=Toto
[toto@amphi toto]$ p="Je m'appelle $moi"
[toto@amphi toto]$ echo Aujourd\'hui, quel jour sommes nous ? ; read jour
[toto@amphi toto]$ echo aujourd'hui $jour, $p sous le nom $USER, est connecté à la station $HOSTNAME
Quelques variables prédéfinies :
Ces variables sont gérées par le système et ne sont accessibles qu'en lecture.
Ces variables sont automatiquement affectées lors d'un appel de script suivi d'une liste de paramètres.
Leurs valeurs sont récupérables dans
$1, $2 ...$9
- $? C'est la valeur de sortie de la dernière commande. Elle vaut 0 si la commande s'est déroulée sans problème.
- $0 Cette variable contient le nom du script,
- $1 à $9 Les (éventuels) premiers arguments passés à l'appel du script,
- $# le nombre d'arguments passés au script,
- $* La liste des arguments à partir de $1,
- $$ le n° PID du processus courant,
- $! le n° PID du processus fils.
Exemple :
ls -al
echo $?
Réponse
> 0
ifconfig ttyS1
echo $?
Réponse
> 1
Les variables spéciales
$1 $2 $3 ... $8 $9
appelés paramètres de position.
Ces variables prennent comme contenu les valeurs des chaînes passées à la suite du nom du script.
Le séparateur de mot est l'espace, donc utiliser si nécessaire des guillemets
" ".
Remarque :
- le nombre d'arguments est connu grâce à la variable $#
- La liste complète des valeurs des paramètres (au delà des 9 premières) s'obtient grâce à la variable $* .
- Le nom du script se trouve dans $0
La commande
shift
Elle permet d'accéder aux paramètres au delà des 9 premiers.
shift réalise un décalage d'un cran vers la gauche des variables (perte d'une variable).
Exemple :
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
shift
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
shift
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
shift
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
shift
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
Exécutons le script :
1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10 20
3 4 5 6 7 8 9 10 30
4 5 6 7 8 9 10 40
5 6 7 8 9 10 50
Bizarre non ?
Recherchez des informations et modifier le script pour obtenir éventuellement un résultat sur la dernière valeur renvoyée ...
La commande set
Exemple :
set a b c
echo $1, $2, $3
# les valeurs de a, b, c sont récupérées dans $1, $2, $3
1 2 3