# Programmation Bash/Notions essentielles du shell bash

* Introduction
* Hello World
* Notions essentielles du shell bash
* Interactions avec le système de fichiers
* Flux et redirections
* Tests
* Calculs
* Structures conditionnelles
* Boucles
* Interactions avec l'utilisateur
* Regex
* Fonctions
* Scripts
* Enchaînements et scripts
* Liste des commandes
* Commandes ksh
* Problèmes connus
* Introduction
* Hello World
* Notions essentielles du shell bash
* Interactions avec le système de fichiers
* Flux et redirections
* Tests
* Calculs
* Structures conditionnelles
* Boucles
* Interactions avec l'utilisateur
* Regex
* Fonctions
* Scripts
* Enchaînements et scripts
* Liste des commandes
* Commandes ksh
* Problèmes connus
[ Modifier le sommaire ]

## Commandes shell

* Définition
* Une commande shell est une chaîne de caractères en minuscules qui peut être invoquée au travers d'une invite de commande ou d'un script. Des options et des arguments peuvent la compléter. Ceux-ci sont généralement appelés paramètres de la commande.
Exemples de commande bash :

### Syntaxe

La syntaxe générique d'une commande shell est :
où une chaîne de caractères entre crochets est optionnelle.
Le nombre d'argument peut être limité (se reporter au manuel de la commande).
Les options de la commande peuvent être :
* des options courtes formées par un tiret suivi d'une lettre. Exemple : -s
* des options longues formées par deux tirets suivis d'un mot. Exemple : --size
* des options courtes ou longues qui exigent un argument. Exemples : --speed 50 ou -s 50

### Informations sur les commandes

La commande whereis permet de rechercher les fichiers exécutables, les sources et les pages de manuel d'une commande Par exemple :
signifie qu'il existe sur le système plusieurs commandes python dans différents répertoire. La page du manuel se trouve dans /usr/share/man/man1/.
La commande which permet de savoir quel est le fichier exécuté lorsque l'on entre le nom d'une commande. Par exemple :
signifie que le code de la commande python utilisée par le système d'exploitation se trouve dans le répertoire /usr/bin/.
Enfin, whatis permet de savoir rapidement à quoi sert une commande. Exemple :

### Manuel

Pour obtenir des informations plus complètes sur l'usage et l'utilité d'une commande, il suffit d'invoquer le manuel en ligne de commande : man nom_de_la_commande. Pour sortir du manuel, composer la combinaison de touche esc : q.
* $ man echo
* Remise en forme de echo(1), attendez SVP...
* ECHO(1) Manuel de l'utilisateur Linux ECHO(1)
* NOM
* echo - Afficher une ligne de texte.
* SYNOPSIS
* echo [-neE] [message ...]
* echo {--help,--version}
* DESCRIPTION
* Cette page de manuel documente la version GNU de echo.
* La plupart des shells ont une commande interne ayant le même nom et les mêmes fonctionnalités.
* echo écrit chaque message sur la sortie standard, avec une espace entre chacun d'eux,
* et un saut de ligne après le dernier.
* OPTIONS
* -n Ne pas effectuer le saut de ligne final.
* -e Interprète les séquences de caractères précédées d'un backslash '\' suivantes :
* \a alerte (sonnerie)
* \b retour en arrière d'un caractère
* \c supprimer le saut de ligne final
* \f saut de page
* \n saut de ligne
* \r retour chariot
* \t tabulation horizontale
* \v tabulation verticale
* \\ backslash
* \nnn le caractère de code ASCII nnn (en octal)
* -E Désactiver les interprétations des séquences spéciales.
* OPTIONS GNU
* Quand la version GNU de echo est appelée avec exactement un argument, les options suivantes sont reconnues :
* --help Afficher un message d'aide sur la sortie standard et se terminer normalement.
* --version
* Afficher un numéro de version sur la sortie standard et se terminer normalement.
* TRADUCTION
* Christophe Blaess, 1996-2003.
* Exemple  : consultation du manuel pour la commande echo
En particulier, la page manuel de bash fourni une documentation quasi-complète. Elle est correctement traduite en français.

## Enchaînements de commandes
### Enchaînements simples
#### Exécutions simultanées

Les commandes com1 jusqu'à comN sont exécutées parallèlement.

#### Exécutions successives

Les commandes com1 jusqu'à comN sont exécutées successivement, les unes après les autres.

### Enchaînements conditionnels
#### Et... et ... et

Dans ce cas, la commande comP ne s'exécute que si com(P-1) s'est soldée par un succès. Exemple :
Dans le premier cas echo toto && echo jojo && echo sidonie, toutes les propositions sont justes, donc elles sont toutes exécutées. Dans le second [ 1 -gt 2 ] && echo jojo, la première partie [ 1 -gt 2 ] teste si 1 est plus grand que 2. Comme cette assertion est fausse, la deuxième partie n'est pas exécutée.
Cette structure est souvent utilisée pour programmer plus rapidement une structure conditionnelle de type if. Par exemple, les deux séries de commandes suivantes produisent le même résultat :

#### Alternative

Dans cet exemple les commandes com1 jusqu'à comN sont exécutées successivement tant qu'aucune ne se termine correctement. Dès qu'une des commandes se solde par un succès, la commande alternative est terminée.
Exemple :

## Variables
### Affectation

Pour affecter une valeur à une variable, la syntaxe est la suivante :
place la valeur dans la variable. La portée de cette variable est locale au processus shell qui l'a définie.
Il faut faire très attention à ne pas placer d'espaces ni avant ni après le signe égal lors d'une affectation en bash. Ainsi, l'expression variable =valeur engendrera l'erreur variable: not found et variable= valeur donnera l'erreur valeur: not found.
Bash utilise le mécanisme de typage dynamique : il n'est donc pas nécessaire de spécifier un type pour une nouvelle variable.
Un nom de variable peut contenir des chiffres, des lettres et des symboles souligné mais ne doit pas commencer par un chiffre. La plupart du temps, les variables du shell bash sont des chaînes de caractères.

### Substitution

On peut vérifier le contenu d'une variable à l'aide de la commande echo :
Ce mécanisme qui différencie la variable de son contenu est nommé substitution. On peut en faire l'expérience grâce aux commandes suivantes :
Par convention, le symbole $ représente l'invite de commande.

### Variables réservées

Certaines variables ont une signification spéciale réservée. Elles sont utilisées lors de la création de scripts :
* pour récupérer les paramètres transmis sur la ligne de commande,
* pour savoir si une commande a échoué ou réussi,
* pour automatiser le traitement de tous paramètres.
Voici la liste de ces variables :
* $0 : nom du script. Plus précisément, il s'agit du paramètre 0 de la ligne de commande, équivalent de argv[0]
* $1, $2, ..., $9 : respectivement premier, deuxième, ..., neuvième paramètre de la ligne de commande
* $* : tous les paramètres vus comme un seul mot
* $@ : tous les paramètres vus comme des mots séparés : "$@" équivaut à "$1" "$2" ...
* $# : nombre de paramètres sur la ligne de commande
* $- : options du shell
* $? : code de retour de la dernière commande. Vaut généralement 0 si cette commande s'est bien déroulée, et un autre nombre correspondant à un type d'erreur, décrit par la commandeerrno.
* $$ : PID du shell
* $! : PID du dernier processus lancé en arrière-plan
* $_ : dernier argument de la commande précédente

### Variables d'environnement

Une variable d'environnement est une variable accessible par tous les processus fils du shell courant. Pour créer une variable d'environnement, on exporte la valeur d'une variable avec la commande export.
Pour illustrer la différence entre une variable locale et une variable d'environnement, il suffit de créer une variable d'environnement, de lancer un shell fils et d'afficher la variable.
Dans ce cas, la valeur de la variable est accessible depuis le shell fils. Si on essaye de faire la même chose sans exporter la variable, la valeur ne sera pas accessible.
La commande env permet de récupérer la liste des variables d'environnement du système d'exploitation. D'une manière générale, les variables d'environnement sont notées en majuscules.
* $ env
* REMOTEHOST=pcloin
* HOST=machine.univ-autonome.fr
* TERM=xterm-color
* SHELL=/bin/bash
* SSH_CLIENT=::ffff:197.123.57.3 55747 22
* SSH_TTY=/dev/pts/0
* http_proxy=http://proxy.univ-autonome.fr:3128/
* GROUP=shadogroup
* USER=shadouser
* temp=2.6.20.1
* HOSTTYPE=i386-linux
* MAIL=/var/mail/shadouser
* PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/game
* PWD=/home/shadouser
* EDITOR=/bin/vi
* LANG=fr_FR@euro
* temp1=Linux
* PS1=\[\033[0;31m\]-->\T<--\[\033[0;34m\][\u@\h]\w[$]\[\033[0;32m\] --> \[\033[0;34m\]
* PS2=>
* SHLVL=2
* HOME=/home/shadouser
* OSTYPE=linux
* VENDOR=intel
* MACHTYPE=i386
* LOGNAME=patin
* SSH_CONNECTION=::ffff:197.123.57.3 55747 ::ffff:199.1.1.62 22
* _=/usr/bin/env
* Utilisation de la commande env  : consultation des variables d'environnement sur station Linux

## Quotes, apostrophe, guillemets et apostrophe inversée
### Simple quote ou apostrophe

Les simples quotes délimitent une chaîne de caractères. Même si cette chaîne contient des commandes ou des variables shell, celles-ci ne seront pas interprétées. Par exemple :

### Doubles quotes ou guillemets

Les doubles quotes délimitent une chaîne de caractères, mais les noms de variable sont interprétés par le shell. Par exemple :
Ceci est utile pour générer des messages dynamiques au sein d'un script.

### Back-quote, apostrophe inversée ou accent grave

Bash considère que les Back-quotes délimitent une commande à exécuter. Les noms de variable et les commandes sont donc interprétés. Par exemple :
Autre exemple :
Cette commande affiche le contenu du répertoire courant à l'écran. Elle est strictement équivalente à ls.
Le caractère apostrophe inversée est obtenu sur les clavier PC français par la combinaison Alt Gr + 7 et se trouve à gauche de la touche retour sur les clavier Macintosh.
* ↑ https://www.quennec.fr/book/export/html/269
* ↑ https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/