summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjerome <jerome@xlinfo.fr>2024-04-14 17:04:20 +0200
committerjerome <jerome@xlinfo.fr>2024-04-14 17:04:20 +0200
commit50b0c03236f63fb25f40c47d204eeacbaf9b5d69 (patch)
tree9618a8ba231a221325b645415dfbe098c697dad8
parentfbe94e6342d80fe9a79b1391b1ce2d3e547e7dbd (diff)
downloadbash_tutorial-50b0c03236f63fb25f40c47d204eeacbaf9b5d69.tar.gz
bash_tutorial-50b0c03236f63fb25f40c47d204eeacbaf9b5d69.zip
numerotation des fichiers
-rwxr-xr-xexemple0127
-rwxr-xr-xexemple0217
-rwxr-xr-xexemple0339
-rwxr-xr-xexemple0444
-rwxr-xr-xexemple0579
-rwxr-xr-xexemple0670
-rwxr-xr-xexemple0746
-rwxr-xr-xexemple0885
-rwxr-xr-xexemple0945
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