Le Bash, c’est quoi ?
Le langage Bash (Bourne Again SHell) est un langage de script interprété par un terminal Unix/Linux.
Il sert principalement à automatiser des tâches système, manipuler des fichiers, exécuter des commandes, etc.
Le Bash est un language de programmation, mais en tant que tel il n’est pas très utile, il est principalement utilisé en conjonction avec des commandes qui permettent d’interagir avec le système.
Ces commandes (ainsi que le Shell) sont installé par défaut sur la plupart des distribution Linux.
Si vous utilisez une distribution Linux (ou WSL sur windows / une VM), la commande man va être très utile, man commande vous donne le manuel de la commande en question, ce qui est pratique (surtout pour les différents flags et autre fonctions)
La commande info est aussi utile mais plus complète (je recommande de lire les info sur emacs mais cela prend du temps à comprendre), elle est utilisé par plusieurs programme (tar, bash, emacs ainsi que de nombreuses commandes du standard GNU l’utilise en complément de man)
Les scripts Bash ont généralement l’extension .sh et commencent toujours par une ligne d’en-tête (appelée shebang) :
Vous pouvez utiliser tout le Bash en ligne de commande (ligne par ligne), mais pour faire un fichier il faut utiliser la commande chmod +x mon_fichier.sh
La commande chmod est expliqué ici
| |
Les conventions recommandent :
- d’utiliser des minuscules pour les noms de variables et de fonctions
- de séparer les mots par des underscores
_:ma_variable,ma_fonction() - Pas d’espaces entre les affectations :
x=10(et nonx = 10).
Mettre des espaces entre les affectations casse le système d’affectation !
Les variables
| |
- Pour utiliser une variable, on écrit
$nom_variable - Les variables sont toujours des chaînes de caractères en Bash, même si elles contiennent des nombres
Les tableaux
| |
Les indices commencent à 0.
[@] permet d’afficher tous les éléments, # donne la taille du tableau.
Entrées / sorties
Les entrées
Lire une valeur entrée par l’utilisateur avec read :
| |
-p: n’ajoute pas de retour à la ligne-i: permet d’entrer une liste-d: continue jusqu’à ce que la lettre delimitante est lue (-d "i"par exemple)
Les sorties
Afficher un texte avec echo :
| |
-n: n’ajoute pas de retour à la ligne-e: permet d’interpréter les caractères spéciaux comme\n(nouvelle ligne)
Les conditions
| |
- Les crochets
[et]entourent les conditions (avec espaces obligatoires) - Les opérateurs numériques :
-lt(<),-le(<=),-gt(>),-ge(>=),-eq(=),-ne(!=) - Les chaînes de caractères :
==,!=,-z(vide),-n(non vide)
Les boucles
Boucle for
| |
Les boucles utilise .. pour donner un début et une fin
1..5 va de 1 à 5 (inclut)
Boucle while
| |
Boucle until
| |
Page info de Bash sur les boucles
Et oui, tout les manuels / pages info sont en anglais (à moins de changer le locale)
Les fonctions
| |
| |
Les cas (switch)
| |
- Chaque motif est séparé par
| ;;marque la fin d’un bloc*correspond au cas par défautesactermine la structure
Les tests de fichiers
| |
-f: fichier régulier-d: dossier-e: existe-r,-w,-x: lisible, modifiable, exécutable
Piping et redirections
Les pipes (|) permettent d’envoyer la sortie d’une commande comme entrée d’une autre commande.
Les redirections (>, >>, <) permettent de manipuler les flux d’entrée/sortie.
| |
|: utilise la sortie d’une commande comme l’entrée d’une autre>: écrit dans un fichier (écrase)>>: ajoute à un fichier<: lit à partir d’un fichier
Commandes utiles en ligne de commande
grep
grep cherche du texte dans un fichier ou dans la sortie d’une commande.
| |
La fonction grep permet d’utiliser des patternes Regex.
Les classes de caractère
[abc]: un caractère, soitasoitbsoitc[^abc]: un caractère, saufa,bouc[a-c]: un caractère deaàc[^a-c]: un caractère, sauf deaàc[0-9: un nombre (aussi possible d’utiliser\d)[a-cA-C]: un caractère deaàcouAàC
Il y a aussi les classes de caractères UNIX
[[:alnum:]]: tout les caractères (équivalent à[0-9A-Za-z])[[:alpha]]: tout les caractères (équivalent à[A-Za-z)[[:digit:]]: tout les nombres (équivalent à[0-9])[[:lower:]] & [[:upper:]]tout les caractères en minuscules et majuscules
Quantité
Tout les quantificateurs supportent les classes de caractère
a?: zero ou unaa*: zero ou plusieursaa+: un ou plusieursaa{4}: exactement 4aa{4,}: 4 ou plus deaa{1,4}: entre 1 et 4a
Séquences spéciales
Ces séquences permettent de définir des concepts et caractères non commun
.: n’importe quel caractère unique\s: les espaces\S: les non espaces\d: les nombres\D: les non nombresR: les retour à la lignes
Pour plus d’info, allez sur quickref : Regex
tr
Change ou modifie les caractères (supporte les classes de caractères UNIX [:alpha:] / [:alnum:]…).
| |
Il est possible d’utiliser une partie des classes UNIX
| |
cut
cut découpe les lignes selon un délimiteur.
| |
-d: donne le délimiteur à utiliser-f: quel field(s) à renvoyer (peut être une liste)
Exemple
| |
Résultat
ceci,est,un
sort
Trie les lignes d’un fichier ou d’une commande.
| |
uniq
Supprime les doublons (souvent combiné avec sort).
| |
wc
Compte le nombre de lignes, mots, ou caractères.
| |
tails
Renvoi les dernière ligne(s) d’un fichier
| |
head
Renvoi les première ligne(s) d’un fichier
| |
awk
Permet de manipuler et formater des colonnes (langage de traitement de texte).
| |
sed
Permet de rechercher et remplacer du texte.
La commande sed supporte aussi le Regex.
| |
chmod
La commande chmod permet de modifier les droits des fichiers, la syntaxe est comme tel
| |
Operateurs
Les opérateurs sont +, -, =
+: donne des permissions-: retire des permissions=: attribut des permissions différentes
Groupes
Les groupes sont : u, g, o, a
u: l’utilisateurg: le groupe auquel l’utilisateur appartiento: les autres (pas dans le groupes)a: tout le monde
Un seul groupe peut est owner du fichier
Permissions
Les permissions sont : r, w, x (on peut aussi utiliser l’octal, voir man chmod)
r: lire le fichierw: écrire dans le fichierx: éxecute un fichier ou traverse un dossier
| |
Ommetre le groupe assume l’utilisateur
| |