# UNIX E3
> [name= (c) 2019 Alexandre PRIMAULT, Sixtine TRAVERSE - Utilisation autorisée]
[TOC]
<p style="page-break-after: always;"> </p>
<p style="page-break-before: always;"> </p>
# Commandes linux
### `more` et `cat` - Visualiser le contenu d'un fichier
:::info
`more [OPTIONS...] FILENAME`
:::
*Permet de visualiser le contenu un fichier avec pause. Utilisation de la touche **espace** pour continuer la lecture du fichier et **q** pour quitter.*
:::info
`cat [OPTIONS...] FILENAME`
:::
*Affiche le contenu du fichier FILENAME dans la sortie standard*
### `ls` - Visualiser le contenu d'un dossier
:::info
`ls [OPTIONS...] FOLDERNAME`
:::
| Option | Signification |
| -------- | -------- |
| -a | Affiche aussi les fichiers et dossiers cachés |
| -A | Affiche aussi les fichiers et dossiers cachés à l'exception de `.` et `..` |
| -h | Affiche les tailles de fichiers dans un format plus lisible |
| -l | Affiche le contenu du dossier en ligne avec, dans l'ordre, les droits, le propriétaire, le groupe, la taille, la date de modification et le nom de chaque fichier |
| -R | Liste récursive du contenu des dossiers (arborescence complète - arbre de fichiers) |
| -r | Inverser le tri du contenu des répertoires |
| -t | Affichage des fichiers par ordre de modification en commençant par le plus récent |
| -v | Trier le contenu des répertoires en fonction de la version des fichiers (ex : ls -1v) |
| -X | Trier l'affichage du contenu par ordre alphabétique des extensions (les fichiers sans extension sont affichés en premier) |
### `mkdir` - Créer un dossier
:::info
`mkdir [OPTIONS...] FOLDERNAMES...`
:::
*Il est possible de créer plusieurs dossier, séparés par un espace*
| Option | Signification |
| -------- | -------- |
| -m XXX | Permet de spécifier les droits sur le nouveau dossier (au format décimal, voir [Utilisateurs et droits](#Utilisateurs-et-droits) ) |
| -p | Création récursive des dossiers |
| -v | Affiche un message quand le dossier a été créé (verbose) |
| -z | SELinux default security context |
### `rm` - Supprimer un fichier/dossier
:::info
`rm [OPTIONS...] NAME`
:::
*Par défaut, ne demande pas de confirmation de suppression*
| Option | Signification |
| -------- | -------- |
| -f | Forcer l'effacement du fichier ou du dossier et désactive le fonctionnement de l'option `-i` |
| -i | Demander à l'utilisateur de confirmer l'effacement de chaque fichier |
| -r | Supprimer récursivement le contenu des répertoires ainsi que le répertoire. Option obligatoire pour supprimer un répertoire non vide |
:::warning
Variante : `rmdir [OPTIONS...] FOLDERNAME`
**Supprimer un dossier. Ne fonctionne que si le dossier est vide**
:::
### `cp` - Copier un fichier ou un dossier
:::info
`cp [OPTIONS...] NAME`
:::
| Option | Signification |
| -------- | -------- |
| -f | Force la copie d'un élément. L'absence de cette option n'empêche pas l'écrasement d'un fichier par celui copié et désactive le fonctionnement de l'option `-i` |
| -i | Demander confirmation avant d'écraser un fichier dans la destination |
| -R | Copier récursivement les répertoires |
| -v | Affiche les éléments copiés (verbose) |
:::danger
- Si un fichier est copié dans un dossier contenant un fichier de même nom, l'ancien fichier sera écrasé.
- Si un dossier est copié dans un dossier contenant un dossier de même nom, les 2 dossiers seront fusionnés récursivement. La règle précédente pour les fichiers s'applique pour les fichiers contenu dans le dossier et l'intégralité de ses sous-dossiers.
:::
### `mv` - Déplacer un fichier ou un dossier
:::info
`mv [OPTIONS...] NAME`
:::
| Option | Signification |
| -------- | -------- |
| -f | Force le déplacement d'un élément. L'absence de cette option n'empêche pas l'écrasement d'un fichier par celui copié et désactive le fonctionnement de l'option `-i` |
| -i | Demander confirmation avant d'écraser un fichier dans la destination |
| -v | Affiche les éléments déplacés (verbose) |
:::danger
- Si un fichier/dossier est déplacé dans le même dossier, il est renommé.
- Si un fichier est déplacé dans un dossier contenant un fichier de même nom, l'ancien fichier sera écrasé.
- Si un dossier est déplacé dans un dossier contenant un dossier de même nom, les 2 dossiers seront fusionnés récursivement. La règle précédente pour les fichiers s'applique pour les fichiers contenu dans le dossier et l'intégralité de ses sous-dossiers.
:::
### `cut` - Découper une chaine de caractère
:::info
`cut -fSTART[-][-END] -d'DELIMITER'`
Utilise le résultat de la sortie de la commande précédente. Voir les exemples d'utilisation.
:::
| Option | Utilisation |
| -------- | -------- |
| -d | Délimiteur. Composé d'**un seul** caractère qui sera utilisé pour découper la chaine |
| -f | Numéro de l'occurence à afficher. Peut être un intervale. (Voir les exemples d'utilisation) |
:::success
**Exemple d'utilisation :**
- `echo "a.b.c" | cut -d'.' -f2`
Sortie : `b`
- `echo "a.b.c.d.e" | cut -d'.' -f2-4`
Sortie : `b.c.d`
- `echo "a.b.c.d.e" | cut -d'.' -f2-`
Sortie : `b.c.d.e`
:::
### `pwd` - Chemin du répertoire courant
:::info
`pwd`
:::
Affiche le chemin absolu du répertoire courant.
### `cd` - Changer le répertoire courant
:::info
`cd DIRECTORYPATH`
:::
### `find` - Trouver un fichier
:::info
`find PATH -name PATTERN`
:::
- `PATH` = Dossier dans lequel rechercher
- `PATTERN` = Expression utilisée pour la recherche (expression régulière ou nom de fichier)
### `touch` - Créer un fichier
:::info
`touch FILENAME`
:::
*Si le fichier existe, met à jour sa date de modification*
### `wc` - Compter le nombre de caractères, mots ou lignes d'un fichier
:::info
`wc [OPTIONS...] FILENAME`
`... | wc [OPTIONS...]`
:::
| Option | Signification |
| -------- | -------- |
| -c | Compte les caractères du fichier (nombre d'octets) |
| -l | Compte les lignes du fichier |
| -w | Compte les mots du fichier |
### `chown` - Changer le propriétaire d'un fichier
:::info
`chown USERNAME FILENAME`
:::
:::danger
On ne peut pas reprendre un fichier donné à un autre utilisateur.
:::
### `chgrp` - Changer le groupe d'un fichier
:::info
`chgrp GROUPNAME FILENAME`
:::
### `chmod` - Changer les droits d'un fichier
:::info
`chmod DROITS FILENAME`
:::

*Page 36-38 diapo 6 pages en 1*
### `sort` - Trier des lignes et les afficher
:::info
`... | sort`
`sort [OPTIONS...] FILENAMES...`
:::
| Option | Signification |
| -------- | -------- |
| -m | Concatène les fichiers avant de trier les lignes |
### `grep` - Sélection de lignes
Voir [Expression régulières avec `grep`](#Expressions-régulières-avec-grep)
### `who` - Voir les utilisateurs connectés
:::info
`who`
:::
```bash=
# Exemple de sortie
local console Sep 25 08:14
local ttys000 Sep 29 16:17
```
### `whoami` - Affiche le pseudo de l'utilisateur courant
:::info
`whoami`
:::
```bash=
# Exemple de sortie
local
```
### `ps` - Processus
:::info
`ps`
:::
*Affiche l'état des processus en cours*
### `set` - Affichage des variables d'environnement
:::info
`set`
:::
### `alias` - Création d'un alias de commande
:::info
`alias ALIASNAME='COMMAND'`
:::
Liste des alias avec la commande `alias` seule.
### `head` - Afficher le début d'un fichier
:::info
`head -N FILENAME`
:::
*Affiche les N premières lignes d'un fichier*
### `tail` - Afficher la fin d'un fichier
:::info
`tail -N FILENAME`
:::
*Affiche les N dernières lignes d'un fichier*
<p style="page-break-after: always;"> </p>
<p style="page-break-before: always;"> </p>
# Expressions régulières avec `grep`
## Utilisation de la commande et options
:::info
`grep [OPTIONS...] PATTERN FILENAME`
:::
:::success
`grep -E '[0-9]{2,}' file`
:::


## Métacaractères
| Métacaractère | Description |
| -------- | -------- |
| ^ | Placé en début d'expression, signifie que le motif qui suit doit se trouver **exactement** en DEBUT de ligne (attention aux tabulations,...) |
| $ | Placé en fin d'expression, signifie que le motif qui suit doit se trouver **exactement** en FIN de ligne (attention aux tabulations, espaces,...) |
| \| | Reconnait l'un ou l'autre des caractères (ou expressions) qu'elle sépare. Souvent utilisé avec une paire de parenthèses. |
| * | Reconnait la présence de l'élément précédent entre 0 et n fois. |
| + | Reconnait la présence de l'élément précédent entre 1 et n fois. |
| ? | Reconnait la présence de l'élément précédent entre 0 et 1 fois. |
| . | Reconnait **un** caractère quelconque (sauf [`\n` - Saut de ligne](#Caractères-spéciaux)) |
| [ ] | Reconnait **un** caractère parmis ceux énumérés dans la paire de crochets |
| {m} | Reconnait la répétition de m fois **exactement** de l'élément précédent |
| {m,n} | Reconnait la répétition entre m à n fois (inclus) de l'élément précédent |
| {m,} | Reconnait la répétition de m fois **au moins** de l'élément précédent |
| \\< | Placé en début d'expression, signifie que le motif qui suit doit se trouver **exactement** en DEBUT de mot |
| \\> | Placé en fin d'expression, signifie que le motif qui précède doit se trouver **exactement** en FIN de mot |
### Métacaractères dans une paire de crochet
| Métacaractère | Description |
| -------- | -------- |
| ^ | Utilisé dans une paire de crochet (en première position), reconnait les caractères différents de ceux contenus dans la paire de crochet |
| - | Désigne l'intervalle entre les 2 caractères présents de part et d'autre du tiret dans une paire de crochet. |
:::warning
Pour utiliser un métacaractère en tant que caractère simple, on utilise le caractère d'échappement `\` suivi du caractère en question.
Un mot est une chaine de caractère constituée uniquement de caractères alphabétiques et numériques ainsi que du caractère `_` (underscore)
:::
## Classes de caractère prédéfinies (norme POSIX)


:::danger
Ces séquences ne sont utilisables que dans une expression entre crochets
Exemple : `[[:alpha:]01]` pour ne prendre que les lettres ainsi que 0 et 1.
:::
## Caractères spéciaux
| Caractère | Description |
| -------- | -------- |
| \\n | Retour à la ligne |
| \\t | Tabulation |
## Exemples
- `\< est \>` - Reconnait le mot entier est
<p style="page-break-after: always;"> </p>
<p style="page-break-before: always;"> </p>
# Scripts
## Entrée utilisateur
:::info
`read -p "Entrez un nombre : " NOM_VARIABLE`
:::
## Déclaration et affichage du contenu d'une variable
:::info
`NOM_VARIABLE="toto"`
`echo $NOM_VARIABLE` # Retourne toto
:::
:::danger
Pas d'espace avant ni après le `=` lors de la déclaration d'une variable !
:::
## Variables spéciales

## Structures conditionnelles
### `if`
```bash
if [ condition ]; then
# Code à exécuter
elif [ condition ]; then # else if - Facultatif
# Code à éxécuter
else # Facultatif
# Code à exécuter
fi
```
:::info
Vrai = 0
Faux = 1 (ou supérieur)
:::
#### Opérateurs logiques

#### Opérateurs de comparaison - Nombres

#### Opérateurs de comparaison - Chaines

#### Opérateurs logiques et de comparaison - Fichiers et dossiers

### `case`
```bash
case $VAR_A_REGARDER in
val_1 ) commande1 ;; # Ne pas oublier ;;
val_2 ) commande2 ;;
val_3 ) commande3 ;;
* ) echo "Cas par défaut" ;;
esac
```
:::danger
**NE PAS OUBLIER LES ;;**
:::
### `select`
```bash
select ITEM in "Choix 1" "Choix 2" "Choix 3" ...
do
case $REPLY in
1 ) "Vous avez choisi le choix $ITEM" ;; # Ne pas oublier ;;
2 ) commande2 ;;
3 ) commande3 ;;
* ) echo "Sélection invalide" ;;
esac
done
```
## Boucles
### `for`
```bash
for (( i = 0; i < 10; i++ )); do
#statements
done
```
```bash
for elem in $var; do
#statements
# Exemple : 'echo $elem'
done
```
### `while`
```bash
while [[ condition ]]; do
#statements
done
```
### `until`
:::warning
La condition est exécutée après le contenu de la boucle
:::
```bash
until [[ condition ]]; do
#statements
done
```
## Exemples
### Lire les mots d'un fichier
```bash=
for mot in $texte; do
# Code exécuté à chaque boucle
done
```
### Lire les lignes d'un fichier
```bash=
while read line
do
echo $line
done < data.txt
```
### Exécuter une commande et vérifier le résultat
```bash=
# Tant que l'utilisateur le désire,
# Exécuter la commande tapée par l'utilisateur
# Afficher un message d'erreur si la commande c'est mal terminée
until [[ $COMMANDE == "stop" ]]; do
read -p "Entrez une commande (stop pour sortir) " COMMANDE
$COMMANDE 2> /dev/null
ERR_CODE=$?
if [[ $ERR_CODE -gt 0 ]]; then
echo "Une erreur est survenue lors de l'exécution de la
commande '$COMMANDE' (code d'erreur $ERR_CODE)"
fi
done
```
### Affichage d'un menu avec `while`
```bash=
while [ 1 -eq 1 ]; do # Boucle infinie
read -p "--- MENU ---
1. Afficher le nombre de personne
2.Afficher la liste des processus
3. Afficher la date
9. Quitter
Selectionner une option : " REPLY
case $REPLY in
1) who | wc -l ;; # Ne pas oublier ;;
2) ps ;;
3) date ;;
9) exit 0 ;; # Quitte le script
*) echo "Veuillez saisir une entrée correcte" ;;
esac
done
```
# Arithmétique
:::info
Les expression contenues dans `$((...))` seront traitées comme des expressions arithmétiques
Il est aussi possible d'utiliser `let` pour déclarer une expression arithmétique
:::
:::danger
Dans une expression arithmétique, les variables ne sont pas préfixées par `$`
:::
:::success
`a=$((2+2))`
`echo $a` # Retourne 4
`let b=a+a`
`echo $b` # Retourne 8
`a=$((b+b))`
`echo $a` # Retourne 16
:::
# Redirections et pipe
| Symbole | Signification |
| -------- | -------- |
| < | Redirige l'entrée standard |
| > | Redirige la sortie standard |
| >> | Concatène la sortie standard (si c'est un fichier, ajoute le contenu à la fin de ce dernier) |
| 2> | Redirige la sortie d'erreur |
| >& | Redirige la sortie standard et la sortie d'erreur |
| \| | Le pipe permet d'utiliser la sortie de la commande précédent le signe `|` comme entrée de la commande suivante
# Bibliographie
- Notes de TP, Sixtine TRAVERSE, 2019
- Notes de TP et scripts, Alexandre PRIMAULT, 2019
- Théorie des langages formels - Expressions régulières, Céline MARTEAU, 2018
- Expressions régulières avec l'outil GREP, Céline MARTEAU, 2018
- Introduction à Unix, Benjamin PERRET, 2019