## 2 - redirections et assemblages

- 2.1 : `echo "hello" > hello.txt`, puis faire `cat hello.txt` pour confirmer le résultat attendu
- 2.2 : `echo "world" >> hello.txt`, puis faire `cat hello.txt` pour confirmer le résultat attendu
- 2.3 : `ls /usr/bin/ > files.tmplist` puis `less files.tmplist`. Vous devriez constater que la liste est sur une seule colonne comparé à lorsqu'on execute ls "directement" sans redirection, ce qui montre que `ls` "sait" si la sortie est le terminal ou non et peut adapter l'affichage en fonction.
- 2.4 : `bash fibonnaci_forever.sh > suite_de_fibonnaci`, puis `Ctrl+C` après quelques secondes, puis `cat suite_de_fibonnaci` pour confirmer le résultat attendu
- 2.5 : écrire `2+2`, `6\*7`, `10/3` (sur plusieurs lignes) dans un fichier `calcul`, puis faire `bc < calcul`
- 2.6 : `bc <<< "6*7"`
- 2.7 : `mkdir -p ~/formation_linux/calculs; echo '6*7' > ~/formation_linux/calculs/formule; bc < ~/formation_linux/calculs/formule > ~/formation_linux/calculs/reponse`
- 2.8 : `curl -L fr.wikipedia.org > wikipedia.html >/dev/null 2>&1 || echo "ça n'a pas marché !"`

## 3 - pipes et boîte à outils

- 3.1 : utiliser `alias grep` pour verifier que l'alias existe, sinon ajouter `alias grep="grep --color=auto"` au `.bashrc` et le recharger.
- 3.2 : `cat /etc/passwd | grep "/bin/bash"`
- 3.3 : `cat /etc/passwd | grep "/bin/bash" | tr ':' ' ' | awk '{print $1}'` (on peut aussi utiliser `awk -F:`, ou la commande `cut`)
- 3.4 : `cat /etc/passwd | grep "nologin$" | tr ':' ' ' | awk '{print $1}'`
- 3.5 : Les utilisateurs n'ayant pas de mot de passe sont typiquement caractérisés par un `:x:` sur la ligne (ou eventuellement un `:!:`) dans `/etc/shadow`. On utilise alors un grep 'inversé' (`-v`) pour obtenir les lignes des utilisateurs qui ont vraiment un mot de passe. On utilise aussi un "ou" dans grep (avec `\|`) pour ignorer à la fois les lignes contenant `:!:` et `:x:`.

```bash
sudo cat /etc/shadow | grep -v ":\!:\|:x:" | awk -F: '{print $1}'
```

ou bien, solution avec awk:

```
sudo cat /etc/shadow | awk -F: '{ if ($2 != 'x' && $2 != '!') print $1}'
```

- 3.6 :

```bash
alias esquecestleweekend='date | grep "^Sat \|^Sun " >/dev/null && echo "Cest le weekend" && echo "Cest le weekend" || echo "Arg il faut encore taffer!"
```

- 3.7 : Les lignes vides correspondent à `^$` (début de ligne suivi de fin de ligne) donc : `cat /etc/login.defs | grep -v "^$"` Pour enlever également les commentaires, on utilise un "ou" dans grep (`\|`), ce qui donne : `cat /etc/login.defs | grep -v "^$\|^#"`
- 3.8 : `dpkg-query --status vim | grep -q 'Status: install ok installed' && echo Oui || echo Non`
- 3.9 : `grep -nr "daemon" /etc/`
- 3.10 : `ps -ef | grep -v "UID" | awk '{print $1}' | sort | uniq -c`
- 3.11 : `cat loginattempts.log  | awk '{print $9}' | sort | uniq -c | sort -n`

## 4 - Variables

```bash
#!/bin/bash

DISTRIB=$(cat /etc/os-release \
        | grep PRETTY_NAME \
        | awk -F= '{print $2}' \
        | tr -d '"')

NB_PROCESS=$(ps -ef --no-headers \
           | wc -l)

RAM_TOTALE=$(free -h | grep "^Mem" | awk '{print $2}')
RAM_DISPO=$(free -h | grep "^Mem" | awk '{print $7}')

UPTIME=$(uptime --pretty)
IP_LOCALE=$(ip a | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}' | awk -F/ '{print $1}')

IP_GLOBALE=$(curl --silent ip.yunohost.org)

echo "La distribution est $DISTRIB"
echo "Il y a $NB_PROCESS process actuellement lancés"
echo "Il reste $RAM_DISPO RAM dispo sur $RAM_TOTALE total"
echo "La machine est up depuis $UPTIME"
echo "L'IP locale est $IP_LOCALE"
echo "L'IP globale est $IP_GLOBALE"

RED="\033[31m"
GREEN="\033[32m"
PURPLE="\033[35m"

echo -e "${RED}How ${GREEN}are ${PURPLE}you?"
```

## 5 - Paramétrabilité, interactivité

### 5.2 (add)

```bash
#!/bin/bash

RESULTAT=$(($1 + $2))

echo $RESULTAT
```

### 5.3 (age)

```bash
#!/bin/bash

CURRENT_YEAR=$(date +%Y)

echo -e "En quelle année est-tu né ? "
read YEAR
AGE=$(($CURRENT_YEAR-$YEAR))
echo "Tu as $AGE ans!"
```

### 5.4 (check_user)

```bash
#!/bin/bash

USER="$1"

HOME_USER=$(cat /etc/passwd | grep "^$USER:" | awk -F: '{print $6}')

ESPACE_DISQUE=$(du -hs $HOME_USER | cut -f1)

NB_PROCESS=$(ps au -u $USER --no-headers | wc -l)

NB_TERM=$(ps au -u $USER | grep bash | wc -l)

echo "L'utilisateur utiliser $ESPACE_DISQUE pour son home $HOME_USER"
echo "L'utilisateur a $NB_PROCESS processus en cours"
echo "    dont $NB_TERM terminaux bash"
```


## 7 - les conditions

### 7.1

Un exemple de solution est de rajouter les conditions suivantes après avoir récupéré l'année :

```bash
if [[ "$ANNEE" -le 1900  ]];
then
    echo "Hmmm, t'es sur !?"
    exit 1
fi
if [[ "$ANNEE" -gt 2018  ]];
then
    echo "Tu viens du turfu !?"
    exit 1
fi
```

### 7.3

```bash
#!/bin/bash

if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]
then
    echo ""
    echo "   check_user.sh"
    echo ""
    echo "Permet de vérifier qu'un utilisateur n'exploite"
    echo "pas n'importe comment les ressources du système"
    echo ""
    echo "Lancer le script avec ./check_user.sh <username>"
    echo ""
    exit 0
fi

USER=$1

if ! grep -q "^$USER:" /etc/passwd
then
    echo "L'utilisateur '$USER' n'existe pas !"
    exit 1
fi

NB_PROCESS=$(ps au -u $USER | wc -l)

HOME=$(grep "^$USER:" /etc/passwd | awk -F: '{print $6}')
SPACE_USED=$(du -hs $HOME 2>/dev/null | awk '{print $1}')
SPACE_USED_OCTETS=$(du -s $HOME 2>/dev/null | awk '{print $1}')

echo "L'utilisateur :"
echo " - a $NB_PROCESS processus en cours"
echo " - utilise $SPACE_USED "

if [[ "$NB_PROCESS" -gt 50 ]]
then
   echo "L'utilisateur a trop de processus actifs !" >&2
fi
if [[ "$SPACE_USED_OCTETS" -gt 1000000 ]]
then
   echo "L'utilisateur utilise plus que 1 Go de stockage !"
fi
```


