---
# System prepended metadata

title: UNIX E3

---

# UNIX E3

> [name= (c) 2019 Alexandre PRIMAULT, Sixtine TRAVERSE - Utilisation autorisée]

[TOC]

<p style="page-break-after: always;">&nbsp;</p>
<p style="page-break-before: always;">&nbsp;</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`
:::
![](https://i.imgur.com/u91nglv.png)
*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;">&nbsp;</p>
<p style="page-break-before: always;">&nbsp;</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`
:::

![](https://i.imgur.com/Lm7CH8R.png)
![](https://i.imgur.com/QnkdpQN.png)


## 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)
![](https://i.imgur.com/q8KRDYP.png)
![](https://i.imgur.com/DXrQBfL.png)
:::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;">&nbsp;</p>
<p style="page-break-before: always;">&nbsp;</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
![](https://i.imgur.com/clQTKRA.png)

## 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
![](https://i.imgur.com/SoyH9vn.png)

#### Opérateurs de comparaison - Nombres
![](https://i.imgur.com/TyUdAGL.png)

#### Opérateurs de comparaison - Chaines
![](https://i.imgur.com/Xlku6th.png)

#### Opérateurs logiques et de comparaison - Fichiers et dossiers
![](https://i.imgur.com/pp0D04H.png)


### `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