Shell

Essayer d'être portable. On fait du du bash (voir du sh) pour pouvoir être exécuté partout

Taper des commandes = script. Comme python. Il faut trouver un moyen de faire des bouts de commandes san les executer a=à la fin d'une ligne. Python fait des blocs. shell fait autrement. De plus, tout est orienté commandes sans pratiquement aucune surcouche du shell (on le verra avec les if/then/else qui fonctionnent bien différemment du reste des langages de programmation)

Gestion des paramètres

Fonctions

Les fonctions ne peuvent rendre qu'un entier, c'est leur code de sortie. POur le reste effectuez vos sorties sur la sortie standard (avec echo).

Structures de contrôle

if/then

if 
commandes
then
commandes
fi

Avec un else :

if 
commandes
then
commandes
else
commandes
fi

C'est le retour de la dernière commande avant la ligne avec then qui décide du branchement :

Par exemple, en utilisant les commandes true et false :

if
true
then
echo oui
else
echo non
fi

Ou encore :

if
false
true
then
echo oui
else
echo non
fi

On peut aussi avoir la forme où la première commande peut être placée après le if :

if true
then
echo oui
else
echo non
fi

La forme précédente qui est très pratique lorsque l'on a qu'une seule commande.

Une commande doit précéder l'instruction then si on peut avoir sur une même ligne le if et le then, il faut terminer la commande de test avec un ; :

if true; then
echo oui
else
echo non
fi

La commande test qui est aussi la commande [ (oui, [ est un fichier de /usr/bin) permet de faire de nombreux test courant :

Bash permet également d'utiliser une construction utilisant [[ expression ]] qui rend certains tests plus clair mais est spécifique à bash et ne fonctionnera pas avec d'autres shell ([[ n'est pas une commande, c'est une instruction interne à bash). Préférez donc les constructions avec [ ou test, plus portable.

Il est possible de tester de nombreuses choses, allant de conditions logique à l'existence de fichiers :

boucles for/while/until

Les constructions sont identiques à la construction du if. La seule particularité est la boucle for qui itère sur une suite de mot séparé par des espaces :

for x in salut les gars
do                     
echo $x      
done                   

Ou, de façon équivalente :

for x in salut les gars; do
echo $x      
done                   

On utilise parfois la boucle while pour lire l'entrée standard, en combinaison avec la commande read :

while read line
do
  echo "$line"
done < /dev/stdin

Ou le redoutable :

while read line
do
  echo "$line"
done < "${1:-/dev/stdin}"

Qui lit l'entrée standard si le premier paramètre ($1) n'est pas positionné. Cela utilise une spécificité de bash pour gérer les variables.

Variables

Métacaractères

On a déjà vu les métacaractères du shell, ils commencent par $ et peuvent être utilisés dans les scripts :

Variables internes

Des variables créés par le shell et pouvant être utilisé dans les scripts. A utiliser avec parcimonie car cela rend vos scripts spécifiques à bash.

Process et shell

TBD mieux faire

Le script est par défaut exécuté dans un nouveau shell. Mais ce n'est pas toujours ce que l'on veut :

Supposons que vous ayez un fichier exécutable pid.sh contenant :

#! /bin/sh

echo $$
  1. Le pid du shell courant est accessible avec : echo $$
  2. Le pid précédent est différent du pid du shell exécutant le script : ./pid.sh
  3. On devrait retrouver le même pid en tapant : source ./pid.sh

C'est très utile lorsque l'on exécute un fichier de configuration qui doit s'appliquer au shell courant.

Attention, si vous exécutez exec ./pid.sh le shell faisant le echo vq remplacer le shell courant et donc fermer la fenêtre. Pour l'exécuter sans soucis faite le dans un sous-shell :

$ echo $$
704757
$ bash
$ echo $$
705824
$ exec ./pid.sh 
705824
$ echo $$
704757

Bibliographie