Aujourd'hui, nous allons parler des scripts bash. Ce - , écrit pour le shell bash. Il existe d'autres shells tels que zsh, tcsh, ksh, mais nous nous concentrerons sur bash. Ce matériel est destiné à tous, la seule condition est la capacité à travailler Linux.
Les scripts de ligne de commande sont des collections des mêmes commandes qui peuvent être saisies à partir du clavier, rassemblées dans des fichiers et unies par un objectif commun. Dans ce cas, les résultats du travail des équipes peuvent soit avoir une valeur indépendante, soit servir de données d’entrée pour d’autres équipes. Les scripts constituent un moyen puissant d’automatiser les actions fréquemment effectuées.
Ainsi, si l'on parle de ligne de commande, elle permet d'exécuter plusieurs commandes à la fois en les saisissant séparées par un point-virgule :
pwd ; whoami En fait, si vous avez essayé cela dans votre terminal, votre premier script bash impliquant deux commandes a déjà été écrit. Cela fonctionne comme ça. L'équipe d'abord pwd affiche des informations sur le répertoire de travail actuel, puis la commande whoamiaffiche des informations sur l'utilisateur sous lequel vous êtes connecté.
En utilisant cette approche, vous pouvez combiner autant de commandes que vous le souhaitez sur une seule ligne, la seule limite est le nombre maximum d'arguments pouvant être transmis au programme. Vous pouvez définir cette limite à l'aide de la commande suivante :
getconf ARG_MAXLa ligne de commande est un excellent outil, mais vous devez y saisir des commandes à chaque fois que vous en avez besoin. Et si nous écrivions un ensemble de commandes dans un fichier et appelions simplement ce fichier pour les exécuter ? En fait, le fichier dont nous parlons s’appelle un script de ligne de commande.
Comment fonctionnent les scripts bash
Créez un fichier vide à l'aide de la commande touch. Sa première ligne doit indiquer quel shell nous allons utiliser. Nous sommes intéressés par bash, donc la première ligne du fichier sera :
#!/bin/bash D'autres lignes de ce fichier utilisent le symbole dièse pour indiquer les commentaires que le shell ne traite pas. Cependant, la première ligne est un cas particulier, il y a un dièse suivi d'un point d'exclamation (cette séquence est appelée ) et le chemin vers bash, indiquez au système que le script a été créé spécifiquement pour bash.
Les commandes Shell sont séparées par un saut de ligne, les commentaires sont séparés par un signe dièse. Voici à quoi cela ressemble :
#!/bin/bash
# This is a comment
pwd
whoamiIci, tout comme sur la ligne de commande, vous pouvez écrire des commandes sur une seule ligne, séparées par des points-virgules. Cependant, si vous écrivez les commandes sur des lignes différentes, le fichier est plus facile à lire. Dans tous les cas, le shell les traitera.
Définition des autorisations du fichier de script
Enregistrez le fichier en lui donnant un nom myscript, et le travail de création du script bash est presque terminé. Il ne reste plus qu'à rendre ce fichier exécutable, sinon, si vous essayez de l'exécuter, vous rencontrerez une erreur Permission denied.

Tentative d'exécution d'un fichier de script avec des autorisations mal configurées
Rendons le fichier exécutable :
chmod +x ./myscriptEssayons maintenant de l'exécuter :
./myscriptAprès avoir défini les autorisations, tout fonctionne comme il se doit.

Exécution réussie du script bash
Sortie des messages
Pour afficher du texte sur la console Linux, utilisez la commande echo. Utilisons la connaissance de ce fait et éditons notre script, en ajoutant des explications aux données générées par les commandes déjà présentes :
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiC'est ce qui se passe après l'exécution du script mis à jour.

Sortie de messages à partir d'un script
Nous pouvons désormais afficher des notes explicatives à l'aide de la commande echo. Si vous ne savez pas comment modifier un fichier à l'aide des outils Linux ou si vous n'avez jamais vu la commande auparavant echo, jeter un coup d'œil à matériel.
Utiliser des variables
Les variables vous permettent de stocker des informations dans un fichier de script, telles que les résultats de commandes, pour les utiliser par d'autres commandes.
Il n'y a rien de mal à exécuter des commandes individuelles sans stocker leurs résultats, mais les capacités de cette approche sont très limitées.
Il existe deux types de variables pouvant être utilisées dans les scripts bash :
- Variables d'environnement
- Variables utilisateur
Variables d'environnement
Parfois, les commandes shell doivent fonctionner avec certaines données système. Voici un exemple de la façon d'afficher le répertoire personnel de l'utilisateur actuel :
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Veuillez noter que nous pouvons utiliser une variable système $HOME entre guillemets, cela n'empêchera pas le système de le reconnaître. C'est ce que vous obtenez si vous exécutez le scénario ci-dessus.

Utiliser une variable d'environnement dans un script
Que faire si vous devez afficher un signe dollar sur l'écran ? Essayons ça:
echo "I have $1 in my pocket" Le système détectera un signe dollar dans une chaîne entre guillemets et supposera que nous avons référencé une variable. Le script va essayer d'afficher la valeur d'une variable non définie $1. Ce n’est pas ce dont nous avons besoin. Ce qu'il faut faire?
Dans cette situation, l’utilisation du caractère d’échappement, une barre oblique inverse, avant le signe dollar aidera :
echo "I have $1 in my pocket"Le script affichera désormais exactement ce qui est attendu.

Utiliser une séquence d'échappement pour imprimer un signe dollar
Variables utilisateur
En plus des variables d'environnement, les scripts bash vous permettent de définir et d'utiliser vos propres variables dans le script. Ces variables conservent une valeur jusqu'à ce que le script termine son exécution.
Comme pour les variables système, les variables utilisateur sont accessibles à l'aide du signe dollar :
TNW-CUS-FMP - code promo pour une réduction de 10 % sur nos services, disponible pour activation sous 7 jours
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"C'est ce qui se passe après l'exécution d'un tel script.

Variables personnalisées dans un script
Remplacement de commande
L'une des fonctionnalités les plus utiles des scripts bash est la possibilité d'extraire des informations de la sortie d'une commande et de les affecter à des variables, vous permettant ainsi d'utiliser ces informations n'importe où dans le fichier de script.
Ceci peut être fait de deux façons.
- Utiliser le backtick "`"
- Intentionnellement
$()
Lorsque vous utilisez la première approche, veillez à ne pas inclure de guillemets simples à la place du guillemet arrière. La commande doit être entourée de deux icônes :
mydir=`pwd`Dans la deuxième approche, la même chose s’écrit ainsi :
mydir=$(pwd)Et le script pourrait ressembler à ceci :
#!/bin/bash
mydir=$(pwd)
echo $mydir Lors de son fonctionnement, la sortie de la commande pwdsera enregistré dans une variable mydir, dont le contenu, à l'aide de la commande echo, ira à la console.

Un script qui enregistre les résultats d'une commande dans une variable
Opérations mathématiques
Pour effectuer des opérations mathématiques dans un fichier de script, vous pouvez utiliser une construction telle que $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Opérations mathématiques dans un script
construction de contrôle si-alors
Dans certains scénarios, vous devez contrôler le flux d’exécution des commandes. Par exemple, si une certaine valeur est supérieure à cinq, vous devez effectuer une action, sinon une autre. Ceci est applicable dans de nombreuses situations, et ici la structure de contrôle nous aidera if-then. Dans sa forme la plus simple, cela ressemble à ceci :
if команда
then
команды
fiVoici un exemple fonctionnel :
#!/bin/bash
if pwd
then
echo "It works"
fi Dans ce cas, si la commande est exécutée pwdse terminera avec succès, le texte «ça marche» s'affichera dans la console.
Utilisons les connaissances dont nous disposons et écrivons un script plus complexe. Disons que nous devons trouver un certain utilisateur dans /etc/passwd, et si vous avez réussi à le trouver, signalez qu'il existe.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiC'est ce qui se passe après l'exécution de ce script.

Recherche d'utilisateurs
Ici, nous avons utilisé la commande greprechercher un utilisateur dans un fichier /etc/passwd. Si l'équipe grepque vous ne connaissez pas, sa description peut être trouvée .
Dans cet exemple, si l'utilisateur est trouvé, le script affichera un message correspondant. Que se passe-t-il si l'utilisateur est introuvable ? Dans ce cas, le script terminera simplement son exécution sans rien nous dire. Nous aimerions qu'il nous en parle également, nous allons donc améliorer le code.
construction de contrôle if-then-else
Pour que le programme puisse rapporter à la fois les résultats d'une recherche réussie et d'un échec, nous utiliserons la construction if-then-else. Voici comment cela fonctionne:
if команда
then
команды
else
команды
fi Si la première commande renvoie zéro, ce qui signifie qu'elle a été exécutée avec succès, la condition sera vraie et l'exécution ne se poursuivra pas le long de la branche. else. Sinon, si quelque chose d'autre que zéro est renvoyé, ce qui indiquerait un échec ou un résultat faux, les commandes après else.
Écrivons le script suivant :
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Son exécution a échoué else.

Exécuter un script avec une construction if-then-else
Bon, passons à autre chose et interrogeons-nous sur des conditions plus complexes. Et si vous deviez vérifier non pas une condition, mais plusieurs ? Par exemple, si l'utilisateur souhaité est trouvé, un message doit être affiché, si une autre condition est remplie, un autre message doit être affiché, et ainsi de suite. Dans une telle situation, les conditions imbriquées nous aideront. Cela ressemble à ceci :
if команда1
then
команды
elif команда2
then
команды
fi Si la première commande renvoie zéro, ce qui indique son exécution réussie, les commandes du premier bloc seront exécutées then, sinon, si la première condition est fausse et si la deuxième commande renvoie zéro, le deuxième bloc de code sera exécuté.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi Dans un tel script, vous pouvez par exemple créer un nouvel utilisateur à l'aide de la commande useradd, si la recherche n'a pas produit de résultats, ou faire autre chose d'utile.
Comparaison des nombres
Dans les scripts, vous pouvez comparer des valeurs numériques. Vous trouverez ci-dessous une liste de commandes pertinentes.
n1 -eq n2Renvoie vrai sin1égaln2.
n1 -ge n2Renvoie vrai sin1plus ou égaln2.
n1 -gt n2Renvoie vrai sin1plusn2.
n1 -le n2Renvoie vrai sin1inférieur ou égaln2.
n1 -lt n2Renvoie vrai si n1 est inférieur àn2.
n1 -ne n2Renvoie vrai sin1n'est pas égal àn2.
À titre d'exemple, essayons l'un des opérateurs de comparaison. Notez que l’expression est placée entre crochets.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiC'est ce que cette commande produira.

Comparaison des nombres dans les scripts
Valeur variable val1supérieur à 5, le branchement finit par être exécuté thenopérateur de comparaison et un message correspondant s'affiche dans la console.
Comparaison de chaînes
Les scripts peuvent également comparer des valeurs de chaîne. Les opérateurs de comparaison semblent assez simples, mais les opérations de comparaison de chaînes ont certaines fonctionnalités, que nous aborderons ci-dessous. Voici une liste d'opérateurs.
str1 = str2Teste l’égalité des chaînes, renvoyant vrai si les chaînes sont identiques.
str1 != str2Renvoie vrai si les chaînes ne sont pas identiques.
str1 < str2Renvoie vrai sistr1moins questr2.
str1 > str2Renvoie vrai sistr1plus questr2.
-n str1Renvoie vrai si longueurstr1Au dessus de zéro.
-z str1Renvoie vrai si longueurstr1égal à zéro.
Voici un exemple de comparaison de chaînes dans un script :
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiÀ la suite de l'exécution du script, nous obtenons ce qui suit.

Comparaison de chaînes dans des scripts
Voici une fonctionnalité de comparaison de chaînes qui mérite d'être mentionnée. À savoir, les opérateurs ">" et "<" doivent être échappés avec une barre oblique inverse, sinon le script ne fonctionnera pas correctement, même si aucun message d'erreur n'apparaîtra. Le script interprète le signe ">" comme une commande de redirection de sortie.
Voici à quoi ressemble le travail avec ces opérateurs dans le code :
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiVoici les résultats du script.

Comparaison de chaînes, avertissement donné
Veuillez noter que le script, bien qu'exécuté, émet un avertissement :
./myscript: line 5: [: too many arguments Pour nous débarrasser de cet avertissement, nous concluons $val2 entre guillemets doubles :
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiMaintenant, tout fonctionne comme il se doit.

Comparaison de chaînes
Une autre caractéristique des opérateurs ">" et "<" est la manière dont ils fonctionnent avec les caractères majuscules et minuscules. Afin de comprendre cette fonctionnalité, préparons un fichier texte avec le contenu suivant :
Likegeeks
likegeeks Sauvons-le en lui donnant un nom myfile, puis exécutez la commande suivante dans le terminal :
sort myfileIl triera les lignes du fichier comme ceci :
likegeeks
Likegeeks Équipe sort, par défaut, trie les chaînes par ordre croissant, c'est-à-dire que la lettre minuscule dans notre exemple est plus petite que la lettre majuscule. Préparons maintenant un script qui comparera les mêmes chaînes :
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiSi vous l'exécutez, il s'avère que tout est inversé : la lettre minuscule est désormais plus grande que la majuscule.

La commande de tri et la comparaison des chaînes dans un fichier de script
Dans les commandes de comparaison, les lettres majuscules sont plus petites que les lettres minuscules. La comparaison de chaînes se fait ici en comparant les codes ASCII des caractères, l'ordre de tri dépend donc des codes de caractères.
Équipe sort, à son tour, utilise l'ordre de tri spécifié dans les paramètres de langue du système.
Vérifications de fichiers
Les commandes suivantes sont peut-être utilisées le plus souvent dans les scripts bash. Ils vous permettent de vérifier diverses conditions concernant les fichiers. Voici une liste de ces commandes.
-d fileVérifie si un fichier existe et s'il s'agit d'un répertoire.
-e fileVérifie si le fichier existe.
-f fileVérifie si un fichier existe et s'il s'agit d'un fichier.
-r fileVérifie si le fichier existe et est lisible.
-s file ПVérifie si le fichier existe et n'est pas vide.
-w fileVérifie si le fichier existe et est accessible en écriture.
-x fileVérifie si le fichier existe et est exécutable.
file1 -nt file2Vérifie si c'est plus récentfile1quefile2.
file1 -ot file2Vérifie si plus vieuxfile1quefile2.
-O fileVérifie si le fichier existe et appartient à l'utilisateur actuel.
-G fileVérifie si un fichier existe et si son ID de groupe correspond à l'ID de groupe de l'utilisateur actuel.
Ces commandes, ainsi que bien d’autres discutées aujourd’hui, sont faciles à retenir. Leurs noms, abréviations de divers mots, indiquent directement les contrôles qu'ils effectuent.
Essayons l'une des commandes en pratique :
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiCe script, pour un répertoire existant, affichera son contenu.

Lister le contenu d'un répertoire
Nous pensons que vous pouvez expérimenter vous-même les commandes restantes ; elles sont toutes utilisées selon le même principe.
Les résultats de
Aujourd'hui, nous avons expliqué comment commencer à écrire des scripts bash et abordé quelques éléments de base. En fait, le sujet de la programmation bash est énorme. Cet article est une traduction de la première partie d’une large série de 11 documents. Si vous souhaitez continuer dès maintenant, voici une liste des originaux de ces matériaux. Pour plus de commodité, la traduction que vous venez de lire est incluse ici.
- — nous parlons ici de la façon de commencer à créer des scripts bash, de prendre en compte l'utilisation de variables, de décrire les structures conditionnelles, les calculs, les comparaisons de nombres, de chaînes et la recherche d'informations sur les fichiers.
- — ici les fonctionnalités de travail avec les boucles for et while sont révélées.
- — ce matériel est consacré aux paramètres de ligne de commande et aux clés qui peuvent être transmises aux scripts, travaillant avec les données que l'utilisateur saisit et qui peuvent être lues à partir de fichiers.
- - nous parlons ici des descripteurs de fichiers et de leur utilisation, des entrées, des sorties, des flux d'erreurs et de la redirection de sortie.
- — ce matériel est consacré aux signaux Linux, à leur traitement dans des scripts et au lancement de scripts selon un planning.
- — ici, vous pouvez en apprendre davantage sur la création et l'utilisation de fonctions dans des scripts et le développement de bibliothèques.
- — cet article est consacré à l'utilisation de l'éditeur de texte sed streaming.
- — ce matériel est consacré à la programmation dans le langage de traitement de données awk.
- — ici, vous pouvez en savoir plus sur l'utilisation des expressions régulières dans les scripts bash.
- — voici des techniques pour travailler avec des messages pouvant être envoyés aux utilisateurs, ainsi qu'une méthode de surveillance des disques.
- — ce matériel est dédié à l'outil Expect, avec lequel vous pouvez automatiser l'interaction avec des utilitaires interactifs. En particulier, nous parlons des scripts attendus et de leur interaction avec les scripts bash et d'autres programmes.
Nous pensons que l'une des caractéristiques précieuses de cette série d'articles est que, en partant du plus simple, adapté aux utilisateurs de tout niveau, elle mène progressivement à des sujets assez sérieux, donnant à chacun la possibilité d'avancer dans la création de scripts de ligne de commande Linux. .
Chers lecteurs! Nous demandons aux gourous de la programmation bash de raconter comment ils ont atteint le sommet de leur maîtrise, de partager leurs secrets, et nous attendons avec impatience de recevoir les impressions de ceux qui viennent d'écrire leur premier script.
Seuls les utilisateurs enregistrés peuvent participer à l'enquête. s'il te plait.
Dois-je traduire le reste de la série d’articles ?
Oui!
Non, pas besoin
1030 utilisateurs ont voté. 106 utilisateurs se sont abstenus.
Source: habr.com
