diff options
| author | jerome <jerome@xlinfo.fr> | 2024-03-07 17:06:12 +0100 |
|---|---|---|
| committer | jerome <jerome@xlinfo.fr> | 2024-03-07 17:06:12 +0100 |
| commit | f472fe2ffb102bca3aa9d191fb728e563148f8ba (patch) | |
| tree | 4a695f556e8ccc684010607dd40e7cfe0185bfe0 | |
| download | bash_tutorial-f472fe2ffb102bca3aa9d191fb728e563148f8ba.tar.gz bash_tutorial-f472fe2ffb102bca3aa9d191fb728e563148f8ba.zip | |
commit initial
| -rwxr-xr-x | exemple1 | 23 | ||||
| -rwxr-xr-x | exemple10 | 39 | ||||
| -rwxr-xr-x | exemple2 | 17 | ||||
| -rwxr-xr-x | exemple3 | 30 | ||||
| -rwxr-xr-x | exemple4 | 41 | ||||
| -rwxr-xr-x | exemple5 | 76 | ||||
| -rwxr-xr-x | exemple6 | 48 | ||||
| -rwxr-xr-x | exemple7 | 41 | ||||
| -rwxr-xr-x | exemple8 | 75 | ||||
| -rwxr-xr-x | exemple9 | 45 |
10 files changed, 435 insertions, 0 deletions
diff --git a/exemple1 b/exemple1 new file mode 100755 index 0000000..5b3b0af --- /dev/null +++ b/exemple1 @@ -0,0 +1,23 @@ +#!/usr/bin/bash + +### 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" diff --git a/exemple10 b/exemple10 new file mode 100755 index 0000000..b9bddbf --- /dev/null +++ b/exemple10 @@ -0,0 +1,39 @@ +#!/usr/bin/bash + +function hello1 { +echo "Hello $(whoami)" +} + +type hello1 +hello1 +echo + +hello2() { + echo "Hello $1" +} + +type hello2 +hello2 alice +echo + +#Portabilité des variables : +#Par défaut les variables sont globales au script... + +var=1 +echo "var vaut $var" +testvariable() { + var=2 + echo "Dans mafonction, var vaut $var" +} +testvariable +echo "maintenant, var vaut $var" +echo +#Pour qu’une variable soit locale à une fonction, il faut la déclarer locale dans notre fonction: +var=1 +echo "var vaut $var" +testvariable() { + local var=2 + echo "Dans mafonction, var vaut $var" +} +testvariable +echo "maintenant, var vaut $var" diff --git a/exemple2 b/exemple2 new file mode 100755 index 0000000..12b68ed --- /dev/null +++ b/exemple2 @@ -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/exemple3 b/exemple3 new file mode 100755 index 0000000..36112d1 --- /dev/null +++ b/exemple3 @@ -0,0 +1,30 @@ +#!/usr/bin/bash + +mot1=hello +mot2=World + +#longueur de la chaîne +echo $mot1 a ${#mot1} lettres +echo $mot2 a ${#mot2} lettres + +# concaténation +concat=$mot1$mot2 +echo $concat a ${#concat} lettres + +# phrase +phrase="$mot1 $mot2 !" +echo "\"$phrase\" a ${#phrase} lettres (y compris les espaces)" + +# 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/exemple4 b/exemple4 new file mode 100755 index 0000000..b2dd116 --- /dev/null +++ b/exemple4 @@ -0,0 +1,41 @@ +#!/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 + +### Affiche les arguments 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 "$0 demande un ou plusieurs arguments" || echo "Hello $* !" + diff --git a/exemple5 b/exemple5 new file mode 100755 index 0000000..157d9c6 --- /dev/null +++ b/exemple5 @@ -0,0 +1,76 @@ +#!/usr/bin/bash + +# 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 +read -p "Choisis un palindrome : " pal +if [ $(echo $pal|rev) = $pal ]; then + echo "$pal est un palindrome" +else + echo "$pal 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/exemple6 b/exemple6 new file mode 100755 index 0000000..a59fa70 --- /dev/null +++ b/exemple6 @@ -0,0 +1,48 @@ +#!/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 : man rev +until [ -n "$pal" -a "$(echo $pal|rev)" = "$pal" ]; do + read -p "Choisis un palindrome : " pal +done + +# Avec le code de sortie d'une commande Linux +read -p "Entre 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 diff --git a/exemple7 b/exemple7 new file mode 100755 index 0000000..1c672d2 --- /dev/null +++ b/exemple7 @@ -0,0 +1,41 @@ +#!/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 + +# 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/exemple8 b/exemple8 new file mode 100755 index 0000000..3c64531 --- /dev/null +++ b/exemple8 @@ -0,0 +1,75 @@ +#!/usr/bin/bash + +# boucle for +# help for +# parcourit une liste d'éléments +for os in windows linux mac ; do + echo $os +done +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 : " pal + +for ((i = ${#pal} ; i > 0 ; i--)); do + rev=${pal:${#pal}-$i:1}$rev +done +echo "L'inverse de $pal est $rev" +if [ $rev = $pal ]; then + echo "$pal est un palindrome" +else + echo "$pal 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/exemple9 b/exemple9 new file mode 100755 index 0000000..0cf8018 --- /dev/null +++ b/exemple9 @@ -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 |
