# 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%}