diff options
| -rwxr-xr-x | exemple01 | 27 | ||||
| -rwxr-xr-x | exemple02 | 17 | ||||
| -rwxr-xr-x | exemple03 | 39 | ||||
| -rwxr-xr-x | exemple04 | 44 | ||||
| -rwxr-xr-x | exemple05 | 79 | ||||
| -rwxr-xr-x | exemple06 | 70 | ||||
| -rwxr-xr-x | exemple07 | 46 | ||||
| -rwxr-xr-x | exemple08 | 85 | ||||
| -rwxr-xr-x | exemple09 | 45 |
9 files changed, 452 insertions, 0 deletions
diff --git a/exemple01 b/exemple01 new file mode 100755 index 0000000..66b82e4 --- /dev/null +++ b/exemple01 @@ -0,0 +1,27 @@ + + +### Affiche Hello World ### +echo "Hello World !" + +### Affiche une variable qu'on déclare préalablement ### +### Les noms des variables ne peuvent comprendre que des minuscules ou des majuscules, des nombres ou des underscores, mais ne doivent ni commencer par un nombre, ni par un underscore ! +message="World" +echo "Hello $message !" + +### Affiche la substitution d'une commande ### +echo "Hello $(whoami) !" + +### Affiche une variable saisie par l'utilisateur ### +read -p "Quel est votre nom ? " nom +echo "Hello $nom !" +read -sp "Choisissez un mot de passe : " password +echo "Votre mot de passe $password a bien été pris en compte..." + +# help read +# si on ne précise pas le nom de la variable, c'est $REPLY qui contient la saisie de l'utilisateur: +read -p "Vas-y, dis-moi quelque chose : " +echo "tu m'as dit $REPLY" + +# help printf - alternative à echo +printf "je m'appelle %s et j'ai %d ans\n" bob 10 + diff --git a/exemple02 b/exemple02 new file mode 100755 index 0000000..12b68ed --- /dev/null +++ b/exemple02 @@ -0,0 +1,17 @@ +#/usr/bin/bash + +# calculs arythmétiques +a=2 +b=5 +# addition +c=$((a+b)) +echo $c +# incrémentation +((c++)) +echo $c +# entier négatif +c=$((a-b)) +echo $c +# division entière +c=$((b/a)) +echo $c diff --git a/exemple03 b/exemple03 new file mode 100755 index 0000000..0e06c2a --- /dev/null +++ b/exemple03 @@ -0,0 +1,39 @@ +#!/usr/bin/bash + +mot1=hello +mot2=World + +#longueur de la chaîne +echo $mot1 a ${#mot1} lettres +echo $mot2 a ${#mot2} lettres +echo + +# concaténation +concat=$mot1$mot2 +echo $concat +#ou +concat=$mot1 +concat+=$mot2 +echo $concat +echo +echo $concat a ${#concat} lettres +echo + +# phrase +phrase="$mot1 $mot2 !" +echo "\"$phrase\" a ${#phrase} lettres (y compris les espaces)" +echo + +# substitution +echo ${concat/h/H} +echo ${phrase/World/le monde} + +# suppression +echo ${phrase/World} + +# extraction ${string, position, longueur} +# extraction du mot2 : a partir de la sixième lettre (l'index commence à 0) +echo ${concat:5:${#mot2}} +# extraction de la dernière lettre +echo ${concat:${#concat}-1:1} + diff --git a/exemple04 b/exemple04 new file mode 100755 index 0000000..570ef16 --- /dev/null +++ b/exemple04 @@ -0,0 +1,44 @@ +#!/usr/bin/bash + +# La variable spéciale $? renvoie le code de sortie de la dernière commande : 0 si la commande s'est bien passée ou différent de 0 si la commande a échoué. + +# Exemple avec la primitive du shell test +# help test + +# teste l'existence d'un répertoire "repert" +test -d repert +echo $? + +# teste l'existence d'un fichier régulier "fichier" +test -f fichier +echo $? + +# Les enchaînements conditionnels (qui se basent sur le code de sortie) : + +# le "Et logique" : && +test -f fichier && echo "le fichier existe" + +# le "Ou logique" : || +test -f fichier || echo "le fichier n'existe pas" + +# Enchaînement des deux: +test -d repert && echo "le répertoire existe" || echo "le répertoire n'existe pas" +# repert n'existe pas, on le créé et ensuite on se déplace dedans... +test -d repert || mkdir repert && cd repert +pwd +cd - +test -d repert && echo "le répertoire existe" || echo "le répertoire n'existe pas" +# repert existe, on ne le créé pas et on se déplace dedans... +test -d repert || mkdir repert && cd repert +pwd +cd - +rmdir repert +echo + +### Affiche les arguments postionnels de la ligne de commande du script ### +### $1, $2, $3... $* (ou $@) pour tous les arguments ### +### le script s'appelle $0 et a $# arguments ### +test $# -lt 1 && echo "$(basename $0) demande un ou plusieurs arguments" || echo "Hello $* !" + + + diff --git a/exemple05 b/exemple05 new file mode 100755 index 0000000..72ef4f8 --- /dev/null +++ b/exemple05 @@ -0,0 +1,79 @@ +#!/usr/bin/bash +set -x +# Comparaison if,elif,else,fi avec la primitive test +# help if +read -p "Entrez un nombre positif ou négatif : " nb + +if test "$nb" -lt 0; then + echo "$nb est négatif" +elif test "$nb" -eq 0; then + echo "$nb est nul" +else + echo "$nb est positif" +fi + +# Idem avec [ ] syntaxe alternative à test +# help [ +if [ "$nb" -lt 0 ]; then + echo "$nb est négatif" +elif [ "$nb" -eq 0 ]; then + echo "$nb est nul" +else + echo "$nb est positif" +fi + +# Avec and (-a) et or (-o) +# Pour les besoins de l'exemple : on aurait pu bien sûr utiliser la syntaxe "-le" +if [ "$nb" -lt 0 -o "$nb" -eq 0 ]; then + echo "$nb est inférieur ou égal à zéro" +else + echo "$nb est positif" +fi + +# palindrome +# man rev +# man tr +read -p "Choisis un palindrome : " rep +pal=$(echo $rep|tr [A-Z] [a-z]) +if [ $(echo $pal|rev) = $pal ]; then + echo "$rep est un palindrome" +else + echo "$rep n'est pas un palindrome" +fi + +# comparaison avec le code de sortie d'une commande linux +read -p "Entrez le nom d'un utilisateur : " utilisateur + +if who |grep -q $utilisateur ; then + echo "$utilisateur est connecté" +else + echo "$utilisateur n'est pas connecté" +fi + +# Alternative à plusieurs elif... +# help case +read -p "Quelle distribution préfères-tu entre Ubuntu, Fedora ou Manjaro ? " distro +case $distro in + Ubuntu) + echo "Tu es plutôt adepte de la famille Debian";; + Fedora) + echo "Tu es plutôt adepte de la famille RedHat";; + Manjaro) + echo "Tu es plutôt adepte de la famille ArchLinux";; + *) + echo "Connais pas !" +esac + +# Cette syntaxe accepte aussi un ou logique '|' et des motifs comme []... +case $distro in + [uU]buntu) + echo "Tu es plutôt adepte de la famille Debian";; + [fF][eE][dD][oO][rR][aA]) + echo "Tu es plutôt adepte de la famille RedHat";; + Manjaro|manjaro) + echo "Tu es plutôt adepte de la famille ArchLinux";; + *) + echo "Connais pas !" +esac + + diff --git a/exemple06 b/exemple06 new file mode 100755 index 0000000..94523f5 --- /dev/null +++ b/exemple06 @@ -0,0 +1,70 @@ +#!/usr/bin/bash + +read -p "Entre une table de multiplication : " nb + +# boucle while (tant que) +# help while +i=1 +while [ $i -lt 10 ] ;do + echo "$i x $nb = $((i*nb))" + ((i++)) +done + +# boucle until (jusqu'à ce que) +# help until +i=1 +until [ $i -gt 9 ] ;do + echo "$i x $nb = $((i*nb))" + ((i++)) +done + +# palindrome (sans la commande rev) +# voir exemple3 +read -p "Choisisez un palindrome : " rep +pal=$(echo $rep|tr [A-Z] [a-z]) +i=${#pal} +while [ "$i" -gt 0 ] ; do + rev+=${pal:$i-1:1} + ((i--)) +done +echo "L'inverse de $pal est $rev" +if [ $rev = $pal ]; then + echo "$rep est un palindrome" +else + echo "$rep n'est pas un palindrome" +fi +echo + +# Avec le code de sortie d'une commande Linux +read -p "Entrez le nom d'un utilisateur : " utilisateur +while who | grep -q $utilisateur ; do + echo "$utilisateur est connecté" + sleep 5 +done +echo "$utilisateur s'est déconnecté" + +# while true +# break et continue... +# help break +# help continue +i=0 +while true; do + ((i++)) + if [ "$i" -eq 5 ]; then + continue + elif [ "$i" -eq 10 ]; then + break + fi + echo "$i" + sleep 1 +done + +# while et shift : décalage des aguments positionnels ! +if [ "$#" -gt 0 ];then +while [ "$1" != "" ];do + echo "Hello $1" + shift +done +else + echo "Pas d'argument passé au script" +fi diff --git a/exemple07 b/exemple07 new file mode 100755 index 0000000..89c4d88 --- /dev/null +++ b/exemple07 @@ -0,0 +1,46 @@ +#!/usr/bin/bash + +# le mot clé [[ +# help [[ +# [[ est une amélioration bash de la primitive [. Il comporte plusieurs améliorations qui en font un meilleur choix si vous écrivez des scripts ciblant bash, notamment : +# il gère les chaînes vides et les chaînes avec des espaces de manière plus intuitive (plus besoin d'entourer les variables non initialisées de guillemets...) +# il permet d'utiliser les opérateurs && et || pour les tests et < et > pour les comparaisons de chaînes +# il possède un opérateur =~ pour effectuer des correspondances d'expressions régulières. + +# Exemple complètement objectif... +# voir la négation '!' +# attention, ne pas utiliser les guillements ou les apostrophes pour les regexps qui les transforment en chaînes litérales ! +while [[ ! $os =~ [lL]inux ]]; do + read -p "Quel est le meilleur os ? " os +done +unset os +echo "Encore une fois !" +until [[ $os =~ [lL]inux ]]; do + read -p "Quel est le meilleur os ? " os +done + +for arg in $@;do + echo "Hello $arg" +done +echo + +# jeu du nombre mystérieux : +#set -x +echo " ---------------------- " +echo "< Jeu du Nombre Mystère >" +echo " ---------------------- " + secret=$(( RANDOM % 100 +1 )) + nb=0 + while [[ $secret != $reponse ]] + do + ((nb++)) + read -p "Entrez un nombre entre 0 et 100 : " reponse + if [[ ! $reponse =~ ^[0-9]+$ || $reponse -gt 100 || $reponse -le 0 ]] ; then + echo "Hors de l'intervalle !" + elif [[ $reponse -gt $secret ]]; then + echo "Trop grand !" + elif [[ $reponse -lt $secret ]]; then + echo "Trop petit !" + fi + done + echo "Gagné en $nb coups !" diff --git a/exemple08 b/exemple08 new file mode 100755 index 0000000..58aa59a --- /dev/null +++ b/exemple08 @@ -0,0 +1,85 @@ +#!/usr/bin/bash + +# boucle for +# help for +# parcourir une liste d'éléments +for os in windows linux mac ; do + echo $os +done +echo + +# avec les arguments du script +if [ "$#" -gt 0 ]; then + for arg in $@; do + echo $arg + done +else + echo "Pas d'argument passé au script !" +fi +echo + +# {debut..fin..pas} +for i in {0..10..2} ; do + echo $i +done +echo + +#multiplication +read -p "Entrez une table de multiplication : " multiplicateur +for i in {1..10}; do + echo "$i x $multiplicateur = $((i*multiplicateur))" +done +echo + +# palindrome (sans la commande rev) +# voir exemple3 +# en utilisant la syntaxe du C : (( ; ; )) . Permet d'utiliser des variables +read -p "Choisisez un palindrome : " rep +pal=$(echo $rep|tr [A-Z] [a-z]) +for ((i = 0; i <= ${#pal} ; i++)); do + rev=${pal:$i:1}$rev +done +echo "L'inverse de $pal est $rev" +if [ $rev = $pal ]; then + echo "$rep est un palindrome" +else + echo "$rep n'est pas un palindrome" +fi +echo + +# commandes sur des fichiers +for fichier in * ; do + wc -l $fichier +done +echo + +# écrire et lire un fichier +cat > fichier << EOF +première ligne +deuxième ligne +troisième ligne +EOF +monfichier=$(cat fichier) +for ligne in $monfichier; do + echo $ligne +done +echo + +# IFS : Internal Field separator par défaut : nouvelle ligne, tabulation, espace + +IFS=$'\n' +for ligne in $monfichier; do + echo $ligne +done +echo +unset IFS +rm fichier + +# taches parallèles en arrière plan : +for i in {1..254}; do + ip=192.168.2.$i + ping -c1 $ip >/dev/null && echo $ip : ok & +done +wait + + diff --git a/exemple09 b/exemple09 new file mode 100755 index 0000000..0cf8018 --- /dev/null +++ b/exemple09 @@ -0,0 +1,45 @@ +#!/usr/bin/bash + +# la boucle select +# help select + +PS3="Quel est ton os préféré ? " +select os in windows mac linux +do + echo $os + break +done +echo +PS3="Que veux-tu savoir ? " +select cmd in 'version du noyau' 'uptime du serveur' 'derniers utilisateurs connectés' quitter +do + case $cmd in + 'version du noyau') + uname -a;; + 'uptime du serveur') + uptime;; + 'derniers utilisateurs connectés') + last|head;; + quitter) + echo "bye" + break;; + esac +done +echo +# ou on peut utiliser $REPLY +echo "Encore une fois !" +echo +select cmd in 'version du noyau' 'uptime du serveur' 'derniers utilisateurs connectés' 'q pour quitter' +do + case $REPLY in + 1) + uname -a;; + 2) + uptime;; + 3) + last|head;; + 4|q|Q) + echo "bye" + exit;; + esac +done |
