WikiBtsSio

1tsioc2012TpScripts

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 :
  • a=1 ; b=2 ; c=3
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