Affichage des articles dont le libellé est Bash. Afficher tous les articles
Affichage des articles dont le libellé est Bash. Afficher tous les articles

mercredi 7 mars 2007

Les tableaux


Les tableaux

Bash supporte les tableaux à une dimension. Aucune initialisation n'est nécessaire, mais si on tente d'afficher un tableau non initialisé, rien ne sera affiché. Le support des tableaux est un peu différent des autres langages de programmation. Il est possible directement d'assigner une valeur à un index particulier. Bash initialisera les autres index automatiquement.

Création

declare -a mon_tableau

Bash créera un tableau vide.
Il est possible de créer un tableau en lui attribuant des valeurs.

mon_tableau[2]='test'

Bash initilisera mon_tableau[0] et mon_tableau[1] à vide.

Opération

La commande ci-dessous affichera l'item à la position spécifié par l'index.
echo ${mon_tableau[index]}

La commande ci-dessous affichera tous les éléments du tableau
echo ${mon_tableau[*]}

La commande ci-dessous affichera le nombre d'élément du tableau
nbItem=${#mon_tableau[*]}
echo $nbItem

Voici un exemple qui énumère les notions apprisent jusqu'à maintenant
#!/bin/bash

#déclaration d'un tableau
declare -a mon_tableau

#initialisation du tableau
mon_tableau=( nuage soleil neige )

#affiche le deuxième éléments soit neige
echo ${mon_tableau[2]}

#affiche tous les éléments du tableau, soit nuage, soleil et neige
echo ${mon_tableau[*]}

#affiche le nombre d'élément
nbItem=${#mon_tableau[*]}
echo $nbItem

for ((i=0;i<$nbItem;i++)); do
  echo ${mon_tableau[${i}]}
done

Les tableaux en bash peuvent contenir différent type de donnée. Il est donc possible d'avoir des int, des chaînes de caractère dans le même tableau sans problème. Il suffira de faire attention si des opérations sont faites entre les éléments du tableau.

declare -a mon_tableau2

mon_tableau2=( 7 99 avion )

mon_tableau2[3]=`expr ${mon_tableau2[0]} + ${mon_tableau2[1]}`

#affichera 106
echo ${mon_tableau2[3]}

mon_tableau2[4]=`expr ${mon_tableau2[0]} + ${mon_tableau2[2]}`

#ceci générera une erreur car un int ne peut être ajouté à une string
echo ${mon_tableau2[4]}

Il faut donc faire très attention lorsque différents types de donnée sont employé au sein du même tableau.

dimanche 25 février 2007

Les chaînes de caractères


Les chaînes de caractères

Bash possède de nombreuses fonctionnalités pour manipuler les chaînes de caractères qui ne sont pas aissé à maîtriser.

Longueur d'une chaîne de caractère

Il existe au moins 2 méthodes pour y parvenir.
nom="Paul"
${#nom} #retourne 4

nom="Paul"
echo `expr length $nom` #retourne 4

Si la chaîne contient des espaces, il faut mettre des " au tour de la chaîne de caractère lorsqu'on utilise la deuxième méthodes.

nom="Paul Smith"
echo `expr length "$nom"`  #retourne 10

Il faut faire attention lorsque la chaîne de caractère contient des '. Il faut alors utiliser le \.

message='C'\''est froid dehors'
echo ${#message}  #retourne 18
echo ${message}   #retourne C'est froid dehors

Extraction d'une chaîne de caractère

Bash permet d'extraire une chaîne caractère d'une autres à partir de différente position.
Le première paramètre spécifié indique la position de départ et le second indique la longueur.

message="Il fait froid dehors"
echo ${message:3} # retourne fait froid dehors
echo ${message:8:5} # retourne froid
echo ${message:(-6)} # retourne dehors

Enlever des caractères en début de chaîne

Cette possibilité permet d'enlever les caractères se trouvant en début de chaîne, il faut spécifier la chaîne désirer être enlever. Il est possible d'utiliser l'étoile. Elle signifie n'importe quelle caractère.

message="Il fait froid dehors"
echo ${message#Il}   #fait froid dehors
echo ${message#I*d}   #dehors

Dans le seconde cas, il est spécifié, enlever la chaîne débutant par I et se terminant par d.

Enlever des caractères en fin de chaîne

C'est identique à la fonction précédente, excepté qu'elle commence par la fin de la chaîne

message="Il fait froid dehors"
echo ${message%d*s}   #Il fait froid

Remplacer une chaîne par une autre

Le première paramère est la chaîne de caractère initiale, le deuxième est la valeur recherché et le troisière est la valeur qui remplacera le deuxième paramètre.

message="Il fait froid dehors"
echo ${message/froid/chaud}   #Il fait chaud dehors

Prenez note que si vous voulez replacer toutes les occurences du deuxième paramètre par le troisième, il faut doublez le / du deuxième paramètre.

message="Il fait froid dehors"
echo ${message//froid/chaud}   #Il fait chaud dehors

Nous avons vu les quelques fonctions que Bash propose pour manipuler des chaînes de caractères. Leurs syntaxes varie ce qui rend leur utilisation un peu plus difficile.

dimanche 24 avril 2005

Les fonctions


FONCTION

Tout comme dans la majorité des autres langages de programmation, il est possible de créer des fonctions.

Simple fonction

La définition d'une fonction est similaire au langage C.

function bonjour()
{
  echo "bonjour"
}

il est aussi possible de faire:

bonjour()
{
  echo "bonjour"
}

Il suffit d'invoquer le nom de la fonction pour qu'elle soit appelée. La définition de la fonction doit être fait avant son appel.

#!/bin/bash
bonjour()
{
  echo "bonjour"
}

bonjour

Argument

Il est possible de passer des arguments à une fonction. Dans la fonction, il suffit de vérifier la valeur de $1, $2...

#!/bin/bash
information()
{
  if [ -n "$1" ]
  then
    echo $1;
  else
    "Aucun paramètre"
  fi
}

information "salut"
#!/bin/bash
information()
{
  if[ -n "$1"]
    echo $1
  else
    echo "Aucun paramètre";
  fi
  return 0
}

information
information "salut"

Argument

Nous allons maintenant créer une fonction qui retourne une valeur.
function min()
{
  if [ -n "$1" ] && [ -n "$2"  ]
  then
    if [ "$1" -lt  "$2" ]
    then
      return $1;
    else
      return $2;
    fi
  fi
}
min 112 13
echo "$? est la plus petite valeur"

Essayer de mettre une valeur supérieure à 256 comme argument.
Prenez note qu'une fonction ne peut renvoyer une valeur supérieure à 256. Cette contrainte provient des codes de sortie. Dans les nombres négatifs, il est possible d'aller beaucoup plus loin. Il suffit d'utiliser une variable globale pour pallier à ce problème.

VAL=
function min()
{
  if [ -n "$1" ] && [ -n "$2"  ]
  then
    if [ "$1" -lt  "$2" ]
    then
      VAL=$1
    else
      VAL=$2
    fi
  fi
}
min 1132 1300

echo "$VAL est la plus petite valeur "

Prenez note de la syntaxe de la déclaration de la variable VAR.
Vous devez utiliser une variable si vous désirez retourner une chaîne de caractère.
Prenez note qu'une variable déclaré dans une fonction à une portée globale au script. Elle peut donc être utilisé partout ailleurs. Pour éviter cela, il faut mettre avant le nom de la variable local lors de son initialisation.

local prenom="paul"

Nous avons complété la partie traitant des fonctions. Un script avec tous les exemples peut téléchargez ici

dimanche 17 avril 2005

Les opérations arithmétiques


LES OPÉRATIONS ARITHMÉTIQUES

Telles que la majorité des langages, les opérations restes les mêmes : +, -, *, /. C'est assez standard comme syntaxe. Il y a cependant quelques différences pour certaines. Il est nécessaire de mettre le mot: let pour plusieurs opérations.

Exposant

Nous devons employer : ** si on désire effectuer l'opération x^y. La commande ci-dessous retournera 125.
let "x=5**3"
echo $x

Modulo

Modulo retourne le reste de la division. On obtiendra donc 2 avec la commande suivante.
let "x=125%3"
echo $x

Constante

Il est possible comme plusieurs langages, d'employer une syntaxe raccourcie pour les opérations : +, -, *, /, %. Ces instructions deviennent alors: +=, -=, *=, /=, %=.
JOURS=" Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche"
for jours in `echo $JOURS`
do
  let "x +=100$"
done

Notez qu'on aurait pu changer += par une des autres instructions qu'on a vues plus haut: -=, *=...*

Contrainte

Bash convient parfaitement pour des opérations sans trop de complexité. Bash emploie des entiers 32bits pour les nombres donc il est impossible d'utiliser des nombres en dehors de l'intervalle : 2147483648, 2147483647 sans obtenir un message d'erreur. Si vous avez une version moindrement récente de Bash cette contrainte est enlevée. Les nombres à virgule flottante ne peuvent être employés. BC ou une librairie mathématique externe doit être utilisée.
BC est un langage qui permet de faire de multiples opérations avec les nombres. Il a une syntaxe similaire au C.

x=$(echo "2+1.3" | bc)
echo $x

Dans le code ci-dessus, il y a quelques nouveautés. Le contenu du echo à l'intérieur de la parenthèse est envoyé à bc. L'emploi de |, envoie la sortie d'une commande à une autre. C'est ce qu'on appelle un pipe (tuyau).

Nous avons complété la partie traitant des opérations arithmétiques. Un script avec tous les exemples peut être téléchargé ici

lundi 4 avril 2005

Les boucles


LES BOUCLES

Les boucles sont utilisées pour exécuter x fois une opération. Il existe quelques méthodes pour itérer des commandes.

Boucle for

On affiche tous les jours de la semaine. Ces derniers font partie de la liste.
for jours in Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche
do
  echo $jours
done

Au lieu d'inclure une liste (Lundi, Mardi...), il est possible de passer un paramètre. Par exemple, on pourrait afficher tous les fichiers qui commenceraient par b.
for fichier in b*
do
  echo $fichier
done
Notez qu'on aurait obtenu le même résultat en tapant ls b*
Il est possible de mettre la liste des valeurs dans une variable et ensuite de ce servir de cette dernière.
JOURS=" Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche"
for jours in `echo $JOURS`
do
  echo $jours
done

Jusqu'à maintenant, la boucle for qu'on n'a vue n'avait rien à voir avec celle que plusieurs sont habitués d'utiliser en C. Il est bien sûr possible d'avoir une syntaxe similaire. Dans cet exemple, on affiche les chiffres de 1 à 10 et de 10 à 1.
MAX=10
MIN=0
for(( a=1, b=10; a < MAX, b > MIN; a++,b--))
do
 echo $a $b
done
Notez qu'il est obligatoire de mettre une double parenthèse. Nous avons mis deux conditions dans la boucle, aussitôt qu'une des deux est fausse, la bouche est arrêtée. Changez la valeur de MIN pour 3 par exemple et vous allez comprendre...

Boucle while

Cette boucle teste à l'entré si la condition est vraie et boucle tant que cette dernière est vrai.
i=0
j=5
while [ "$i" -lt "$j" ] # tant que i < j
do
  echo "$i"
  i=`expr $i + 1` #ou i++
done

Boucle until

On pourrait dire que cette boucle est l'opposé de la boucle while. Cette boucle teste à l'entrée la condition et boucle tant que cette dernière est fausse.
i=0
j=5
until [ "$i" -lt "$j" ] # tant que i < j
do
  echo "$i"
  i=`expr $i + 1` #ou i++
done

#on affiche i tant que i et j sont identique, bouclerais à l'infini si on n'avait pas mis la condition de test à l'intérieur.
i=0
j=0
until [ "$i" -lt "$j" ]
do
  echo "$i"
  i=`expr $i + 1` #ou i++i
  if [ $i = 8 ]; then
    j=15
  fi
done

Boucler sur un répertoire

Nous allons maintenant voir comment parcourir un répertoire, cet opération est grandement utile lorsqu'on veut effectuer un certain traitement sur des fichiers: convertir, renommer, effacer... des fichiers.
FILES="/home/collinm/Musique/*.mp3"

for file in $FILES
do
  echo $file;
done

Si vous ne voulez pas employer de variable vous devez mettre le nom du répertoire entre `, ce qui donnerait

for file in `ls /home/collinm/Musique/*.mp3`
#le reste est identique...

Nous avons complété la partie traitant des boucles. Un script avec tous les exemples peut être téléchargé ici

samedi 26 mars 2005

Les conditions

LES CONDITIONS
Les conditions sous Bash sont très différentes de ce qu'on peut retrouver dans les autres langages de programmation telle que le C, pascal, Java... Les espaces sont importants, s'ils ne sont pas pris en considérations, il est possible que le script ne puisse fonctionner. Une autre particularité est qu'il existe différents paramètres selon ce qu'on désire tester.

Tableau des opérateurs

Opérateur Description (retourne vrai si..)
-d si le répertoire existe
-e si le fichier existe
-f si le fichier (pas un répertoire ou fichier de périphérique: /dev/sda1...)
-r si le fichier peut être lu
-w si le fichier peut être écrit
-x si le fichier peut être exécuté
-L si le fichier est un lien symbolique
-z si la chaine de caractère est nulle
-n si la chaine de caractère n'est pas nulle
-eq s'ils sont équivalents (nombre)
-neq s'ils ne sont pas équivalents
= ou == si les chaines de caractère ou nombre sont égaux
!= s'ils ne sont pas égaux
-lt est plus petit que
-gt est plus grand que
-le est plus petit ou égale
-ge est plus grand ou égale
-a ou && et logique
-o ou || ou logique

Quelques exemples

On vérifie ci-dessous si le fichier qemu.htm existe. S'il existe, nous affichons un message.
if [ -e qemu.htm ]; then
  echo "Qemu.htm existe";
fi
On vérifie ci-dessous si le contenu de la variable X est plus petit que Y.
X=3
Y=12
if [ $X -lt $Y ]
then
  echo "\$X=$X, est plus grand ou égale \$Y=${Y}"
fi
Notez que si on ne met pas de ";" à la fin du if, le then doit être sur la prochaine ligne. En mettant "\" devant le nom de la variable existante, c'est le nom de la variable qui est affiché.
On vérifie si les chaînes de caractères sont identiques
X="allo"
Y="aillo"
if [ $X = $Y ]; then
 echo "les chaines sont identiques";
else
 echo "les chaines ne sont pas identiques";
fi
Il est possible de savoir si une chaîne de caractère débute ou se termine par un certain caractère.
X="allo"
if [[ $X == a* ]]; then
 echo "$X commence par a";
fi

X="allo2"
if [[ $X == *2 ]]; then
 echo "$X fini par 2";
fi
Les comparaisons binaires peuvent être faites de deux façons avec les opérateurs. Soit, on utilise -a ou && pour le et binaire. Soit on utilise -o ou || pour le ou binaire.
X=33
Y=23
A=12
B=23
if [ $X -gt $Y ] && [ $A -lt $B ]; then
 echo "$X est plus grand que $Y et $A est plus petit que $B ";
fi
Notez que si vous utilisez directement -a (ou -o) vous devez écrire:
X=33
Y=23
A=12
B=23
if [ $X -gt $Y -a $A -lt $B ]; then
 echo "$X est plus grand que $Y et $A est plus petit que $B ";
fi

Imbrication de if

Lorsqu'on a plusieurs de suites, on doit utiliser elif.
X=20
Y=30
Z=40
if [ $Z -lt $X ]; then
 echo "$Z est plus petit que $X";
elif [ $Z -lt $Y ]; then
 echo "$Z est plus petit que $Y";
else
 echo "$Z est plus petit que 50";
fi

Case

Au lieu d'utiliser de nombreux if et else, il peut être pratique d'utiliser un case afin de simplifier le code et de le rendre plus lisible.
echo "Fait t'il soleil ? [oui or non]: "
read reponse
    case $reponse in
        o* | O*)
                echo "vous avez repondu qu'il faisait soleil";
                ;;
        n* | N*)
                echo "vous avez repondu qu'il ne faisait pas soleil";
                ;;
        *)
                echo "vous avez mal répondu à la question";
                ;;
    esac
Vous pouvez noter que chaque condition se termine par ")", qu'à la fin de chaque commande on a ";;" et qu'on inscrit esac à la fin. Il arrive souvent qu'on inscrive la commande à l'envers en bash. Au début de ce script, on pose une question à l'usager. Lorsque l'utilisateur tapera sur une touche et appuiera sur entrée, cette touche sera lu (grâce à la fonction read) et une action sera faite selon sa valeur.

Nous avons completé la partie traitant des conditions. Un script avec tous les exemples peut être téléchargé ici

dimanche 26 septembre 2004

Introduction


INTRODUCTION

Nous allons montrer rapidement la base de Bash afin de pouvoir rapidement commencer à écrire des scripts simples. Nous verrons les concepts présentés plus en détail dans d'autres tutoriels

Commentaire

#Ceci est un commentaire

Variable

#!/bin/bash
nombre=69
chaine="bash"

echo $nombre  #affiche 69
echo $chaine  #affiche bash
69
bash

Condition

#!/bin/bash
os1="linux"
os2="mac"
if [ "$os1" = "$os2" ]; then
 echo "il y a des ressemblances entre ces os"
else
 echo "ces os ne se ressemblent pas"
fi
ces os ne se ressemblent pas

Boucle

Le for est différent des autres langages.
#!/bin/bash
nb="12 13"
for i in $nb; do
  echo item: $i
done
item: 12
item: 13
On va itérer autant de fois qu'il y a d'éléments dans la string.
#!/bin/bash
for i in `seq 1 5`
do
      echo $i
done
1
2
3
4
5
Attention les caractères sont important si vous mettez ' au lieu de ` , vous allez obtenir: seq 1 10
Cette syntaxe permet d'avoir un résultat similaire au langage 10. Les chiffres de 1 à 10 seront affichés.
while
i=0
j=5        
while [ "$i" -lt "$j" ] # tant que i < j
do
  echo "$i"
  i=`expr $i + 1`
done
0
1
2
3
4

#!/bin/bash
i=0
j=5
while [ "$i" -lt "$j" ]
do
  echo "$i"
  i=`expr $i + 1`
done
0
1
2
3
4

#!/bin/bash
i=0
j=5        
while [ "$i" != "$j" ]
do
  echo "$i"
  i=`expr $i + 1`
done
0
1
2
3
4

#!/bin/bash 
FIN=okeefe
until [ "$var1" = "$FIN" ]
do
  echo "($FIN to exit)"
  read var1
done

#!/bin/bash 
COUNTER=15
until [  $COUNTER -lt 10 ];do
   echo COUNTER $COUNTER
   COUNTER=`expr $COUNTER - 1` # peut aussi utiliser: let COUNTER+=1
done
COUNTER 15
COUNTER 14
COUNTER 13
COUNTER 12
COUNTER 11
COUNTER 10
Notez qu'il est possible de mettre le mot: do sur la même ligne que le for, until, while. Il faut alors mettre un ; à la fin de la condition et ensuite on met le do. Cette syntaxe est plus compacte.

case

#!/bin/bash

echo "Appuyer sur une touche et ensuite sur enter."
read Keypress

case "$Keypress" in
  [a-z]   ) echo "Vous avez taper une lettre";;
  [A-Z]   ) echo "Vous avez taper une lettre";;
  [0-9]   ) echo "Vous avez taper un nombre";;
  *       ) echo "Autre";;
esac  
Si vous appuyez sur un chiffre vous obtiendrez
Vous avez tapé un nombre

Fonction

L'utilisation des fonctions est un peu différente sous Windows et Linux.

Windows et Linux

#!/bin/bash 
quit() { 
  echo "allo"
  exit 
}
quit

Linux

#!/bin/bash 
function quit {
  echo "allo" 
  exit 
}
quit

allo
La fonction exit permet de terminer le script.
Vous verrez plus souvent cette dernière syntaxe sous Linux. Nous utiliserons donc la syntaxe de Linux pour le reste des tutoriels.

Bash pour windows


BASH POUR WINDOWS

Un interpréteur de commande sert d'intermédiaire entre l'utilisateur et le système d'exploitation. Il permet de faire différentes tâches. Nous utiliserons Bash. Il en existe de nombreux autres sous Linux, Unix. C'est souvent le Shell par défaut sous Linux. Ce tutoriel permettra à ceux qui trouvent encore difficile de faire les quelques cliques de souris nécessaire pour l'installation de Linux, de pouvoir utiliser bash sous Windows.

Téléchargement de bash

Il est possible de se procurer bash à Cygwin. Diverses informations se retrouvent sur ce site. Plusieurs conseils de configuration y sont dits, si vous désirez avoir un environnement le plus près possible de votre distribution Linux favorite. Cliquer sur . Le téléchargement du logiciel se fera.

 Installation

Une fois le téléchargement fini, cliquer sur le fichier setup.exe téléchargé. Cette fenêtre
apparaîtra



Cliquez sur next. Ensuite sélectionné la source d'installation, nous choisirons « Install from
 Internet ».




Sélectionner ensuite le lieu d'installation du programme, la permission d'utilisation et le type de fichier par défaut.

Spécifiez ensuite où les fichiers téléchargés d'Internet seront entreposés durant l'installation.



Choissisez le type de branchement Internet voulu.


Indiquer le lieu de la source de téléchargement voulue, habituellement une zone près de chez vous devrait être plus rapide.


Choisisez les paquets voulus, j'ai laissé ceux par défaut.


Les icones se créent sur votre bureau.

 L'installation est réussie.




Démarrez Bash en cliquant sur son icône .
Si tout à bien été installé, vous devriez avoir une fenêtre noir qui apparait



.
Vous pouvez maintenant exécuter des scripts bash. En tapant «help», vous avez une liste de commande existante. Nous allons afficher l'arborescence des fichiers de cygwin. Tapé «cd /» ensuite enter. Entrer la commande «ls -l», vous devriez voir une liste de répertoire très connu des utilisateurs Linux.
Dans une console bash, vous pouvez taper «mount» pour voir la liste des lecteurs disponibles. Par exemple pour aller sur le lecteur c, c'est habituellement cd /cygdrive/c. Vous pouvez par la suite naviguer dans votre lecteur tel que le vous feriez sous Dos ou Linux.

Premier scripts

Dans un éditeur texte, tapez ces commandes
#!/bin/bash
os="Windows"
nb=1
echo "Mon $nb script bash sous $os"
Sauvegardez votre fichier sous le nom script1.sh. Sous bash maintenant, rendez votre fichier exécutable. N'oubliez pas de votre rendre où que votre script se site.
chmod +x script1.sh
Maintenant pour exécuter votre script
./script1.sh
À l'écran vous allez voir:
Mon 1 scripts bash sous Windows
Assignez un éditeur texte tel que vim, notepad... au fichier script de bash.
Nous avons vu comment installer l'environnement cygwin sous Windows afin de pouvoir utiliser Bash. Quelques commandes ont été énumérées. Nous en verrons d'avantages dans les tutoriels à venir.

mercredi 15 septembre 2004

Bash



Ce livre offre un moyen de s'initier et s'améliorer sur le script bash. Les auteurs traitent des concepts de bases telle que les flux de donnée, les entrées/sorties, les options de la ligne de commande...

Des concepts plus avancés telle que la gestion de processus, administration du shell sont aussi passé en revue. Ils traitent même de l'édition en utilisation vi et emacs.

Beaucoup d'exemple y sont présenté même s'il manque d'exemple réelement utile. C'est un livre de référence pour quiconque désire se mettre au scrip sous linux.