# MATH in BASH
## Warmup
### Loop
#### Methode 1
```
#!/bin/bash
for n in `seq 1 10`; do
echo $(($n**2))
done
```
#### Methode 2
```
#!/bin/bash
for (( c=1; c<=5; c++))
do
echo "boucle $c "
done
```
#### Methode 3
```
#!/bin/bash
for (( ; ; ))
do
echo "boucle "
done
```
#### Methode 4 (while)
```
#!/bin/bash
i=0
while (($i < 4))
do
echo $i
i=$(($i+1))
done
```
#### Exercices 1 (Loop)
1. Expliquer les différentes méthodes
2. Trouver une méthode non présenter ici réalisant une boucle
3. Réaliser un script permettant de génerer la suite de nombres suivante
`1
5
9 13`
### Les operations
Une addition:
```
# echo $((7+4))
# 11
```
Une soustraction:
```
# echo $((8-2))
# 6
```
Une multiplication:
```
# echo $((4*7))
# 28
```
Une division:
```
# echo $((8/2))
# 4
```
En utilisant une variable
```
#!/bin/bash
c=$((3))
i=$(($c*2))
echo "contenu de la variable i : $i
```
#### Exercices 2 (Loop Complicado)
1. Corriger et trouver l'errreur dans le script ci-dessus.
2. Realiser un script permettant de generer la suite de nombres suivante
```
0
6
12
18
24
30
36
42
48
54
```
3. Realiser un script permettant de generer la suite de nombres suivante. Ce script contient une boucle et des opérations arithmétiques simple. (Vérification professeur)
```
0
1
4
9
16
25
36
49
64
81
100
121
144
169
196
225
256
289
324
361
```
4. Realiser votre propre script permettant de generer la suite de nombres "complexe" à l'aide de 2 opérations artihmétique. La suite est à soumettre à votre prof!
## LOOP Random generator
On vous donne le petit script permettant de générer une série de nombre de manière aléatoire
```
#!/bin/bash
for (( c=1; c<=100; c++))
do
echo $((1 + $RANDOM % 6))
done
```
#### Exercices 3
1. expliquer le fonctionnement de l'instruction `$RANDOM % 6`
2. Proposer un script permettant de générer un nombre aléatoire compris entre 1 et 100
3. Proposer un script permettant de générer 1000 nombres aléatoire compris entre 1 et 100
4. Proposer un script permettant d'écrire dans un fichier 1000 nombres aléatoire compris entre 1 et 100. Une ligne par nombre.
# Equiprobabilité de la fonction random
On va lire dans un premier temps le fichier créer précédement.
## Read file
```
#!/bin/bash
input="number.log"
let "i=0"
while IFS= read -r line
do
echo "$line"
# echo "$i"
let "i++"
done < "$input"
echo nombre de ligne "$i"
```
### Instruction Timing
On évalue la rapadité des opérateurs permettant l'incrémentation.
```
#!/bin/bash
# To focus exclusively on the performance of each type of increment
# statement, we should exclude bash performing while loops from the
# performance measure. So, let's time individual scripts that
# increment $i in their own unique way.
# Declare i as an integer for tests 12 and 13.
echo > t12 'declare -i i; i=i+1'
echo > t13 'declare -i i; i+=1'
# Set i for test 14.
echo > t14 'i=0; i=$(expr $i + 1)'
x=100000
while ((x--)); do
echo >> t0 'i=$((i+1))'
echo >> t1 'i=$((i++))'
echo >> t2 '((i=i+1))'
echo >> t3 '((i+=1))'
echo >> t4 '((i++))'
echo >> t5 '((++i))'
echo >> t6 'let "i=i+1"'
echo >> t7 'let "i+=1"'
echo >> t8 'let "i++"'
echo >> t9 'let i=i+1'
echo >> t10 'let i+=1'
echo >> t11 'let i++'
echo >> t12 'i=i+1'
echo >> t13 'i+=1'
echo >> t14 'i=$(expr $i + 1)'
done
for script in t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14; do
line1="$(head -1 "$script")"
printf "%-24s" "$line1"
{ time bash "$script"; } |& grep user
# Since stderr is being piped to grep above, this will confirm
# there are no errors from running the command:
eval "$line1"
rm "$script"
done
```
```
phil@phil-HP-ProBook-4740s:~/SCRIPT-MATH$ ./incremental-test-perf.sh
i=$((i+1)) user 0m1.245s
i=$((i++)) user 0m1.272s
((i=i+1)) user 0m0.904s
((i+=1)) user 0m0.835s
((i++)) user 0m0.772s
((++i)) user 0m0.831s
let "i=i+1" user 0m1.547s
let "i+=1" user 0m1.461s
let "i++" user 0m1.388s
let i=i+1 user 0m1.306s
let i+=1 user 0m1.235s
let i++ user 0m1.159s
declare -i i; i=i+1 user 0m0.365s
declare -i i; i+=1 user 0m0.314s
i=0; i=$(expr $i + 1) user 1m33.823s
```
#### Exercices 4
1. Proposer un script de lecture de votre fichier de nombre aléatoire le plus rapide possible. Les nombres seront affichés dans l'invite de commande du terminal
## IF THEN THAT
### IF
```
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
fi
```
### IF THEN
```
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
else
echo "The variable is equal or less than 10."
fi
```
### IF THEN THEN THEN
```
#!/bin/bash
echo -n "Enter a number: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "The variable is greater than 10."
elif [[ $VAR -eq 10 ]]
then
echo "The variable is equal to 10."
else
echo "The variable is less than 10."
fi
```
more :https://linuxize.com/post/bash-if-else-statement/
#### Exercices 5
Dans les scripts précédents remplacer les termes
```
gt (greater than),
eq (equivalent),
lt (lower than)
...
```
par leurs équivalents arithmétique.
## String to INT
```
#!/bin/bash
#VAR=$((20))
VAR="20"
VAR_INT=$(($VAR + 0))
if [[ $VAR_INT > 10 ]]
then
echo "The variable is greater than 10."
fi
```
On utilise l'astuce suivante `VAR_INT=$(($VAR + 0))` pour convertir une variable contenant une chaine de caratère en entier.
#### Exercices 6
Lister les types de variables "STRING" et "INT" dans bash. A quoi cela correspond.
# Equiprobabilité?
On lit le fichier générer précédement avec le script suivant.
```
#!/bin/bash
input="number.log"
let "i=0"
while IFS= read -r line
do
echo "$line"
VAR_INT=$(($line + 0))
echo "var_int : " $VAR_INT
if [[ $VAR_INT = 2 ]]
then
echo "The variable is 2."
fi
let "i++"
done < "$input"
echo "Total number lines in files $i"
echo ------------------
```
#### Exercices 7
1. Quelle est la valeur testée
2. Améliorer le script de lecture pour compter le nombre de fois ou la valeur 2 apparait dans le fichier de log.
4. Faire de même pour les chiffres de 1 à 6
#### Exercices 8
Comment afficher un nombre décimal depuis bash (nombre à virgule)[lien](https://www.shell-tips.com/bash/math-arithmetic-calculation/)
```
a=$((5))
b=$((6))
printf %.1f "$((10**3 * $a/$b))e-3"
```
5. Afficher le poucentage des chiffres 1, 2, 3, 4, 5 ,6 contenu dans votre fichier de 1000 nombres
{%youtube obMQ8LdpYYA%}