Aujourd'hui, nous allons parler des scripts bash. Ceci est , écrits pour le shell bash. Il existe d'autres shells, par exemple — zsh, tcsh, ksh, mais nous allons nous concentrer sur bash. Ce matériel est destiné à tous ceux qui souhaitent apprendre, la seule condition étant de savoir travailler dans Linux.
Les scripts de ligne de commande sont des ensembles des mêmes commandes qui peuvent être tapées sur le clavier, regroupées dans des fichiers et réunies dans un objectif commun. Les résultats des commandes peuvent avoir une valeur autonome ou servir d'entrée pour d'autres commandes. Les scripts sont un moyen puissant d'automatiser les actions souvent répétées.
Donc, en parlant de la ligne de commande, elle permet d'exécuter plusieurs commandes en une seule fois en les saisissant via un point-virgule :
pwd ; whoami En fait, si vous avez essayé cela dans votre terminal, votre premier script bash, impliquant deux commandes, est déjà écrit. Il fonctionne de cette manière. D'abord, la commande pwd affiche des informations sur le répertoire de travail actuel, puis la commande whoamimontre les données de l'utilisateur avec lequel vous êtes connecté.
En utilisant cette approche, vous pouvez combiner autant de commandes que vous le souhaitez en une seule ligne, la seule limite étant le nombre maximal d'arguments pouvant être passés au programme. Cette limite peut être déterminée à l'aide de la commande suivante :
getconf ARG_MAXLa ligne de commande est un excellent outil, mais il faut entrer les commandes chaque fois qu'elles sont nécessaires. Que diriez-vous d'enregistrer un ensemble de commandes dans un fichier et de simplement appeler ce fichier pour les exécuter ? En fait, ce fichier dont nous parlons s'appelle un script de ligne de commande.
Comment les scripts bash sont organisés
Créez un fichier vide en utilisant la commande touch. Dans sa première ligne, il faut spécifier quelle оболre nous allons utiliser. Nous sommes intéressés par bash, donc la première ligne du fichier sera la suivante :
#!/bin/bash Dans les autres lignes de ce fichier, le symbole dièse est utilisé pour désigner des commentaires que l'interpréteur ignore. Cependant, la première ligne est un cas particulier : ici, le dièse, suivi d'un point d'exclamation (cette séquence est appelée ) et le chemin vers bash, indiquent au système que le script a été créé spécifiquement pour bash.
Les commandes de la ligne de commande sont séparées par des sauts de ligne, les commentaires sont marqués par le symbole dièse. Voici à quoi cela ressemble :
#!/bin/bash
# This is a comment
pwd
whoamiIci, comme dans la ligne de commande, on peut écrire des commandes sur une seule ligne, en les séparant par des points-virgules. Cependant, si vous écrivez des commandes sur des lignes différentes, le fichier sera plus facile à lire. Dans tous les cas, l'interpréteur les exécutera.
Configuration des autorisations pour le fichier script
Sauvegardez le fichier en lui donnant le 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, en essayant de l'exécuter, vous rencontrerez une erreur Permission denied.

Essai d'exécution du fichier script avec des autorisations mal configurées
Rendons le fichier exécutable :
chmod +x .\/myscriptEssayons maintenant de l'exécuter :
.\/myscriptAprès avoir configuré les autorisations, tout fonctionne comme prévu.

Exécution réussie du script bash
Affichage des messages
Pour afficher du texte dans le terminal Linux, on utilise la commande echo. Profitons de ce fait pour modifier notre script en ajoutant des explications aux données que les commandes existantes affichent :
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiVoici ce que nous obtiendrons après l'exécution du script mis à jour.

Affichage des messages du script
Nous pouvons maintenant afficher des messages explicatifs en utilisant la commande echo. Si vous ne savez pas comment modifier un fichier en utilisant les outils Linux, ou si vous n'avez jamais rencontré la commande echo, jetez un œil au matériel.
Utilisation des variables
Les variables permettent de stocker des informations dans le fichier script, par exemple - les résultats des commandes pour les utiliser dans d'autres commandes.
Il n'y a rien de mal à exécuter des commandes individuelles sans stocker les résultats de leur exécution, mais les possibilités d'une telle approche sont très limitées.
Il existe deux types de variables que l'on peut utiliser dans les scripts bash :
- Variables d'environnement
- Variables utilisateur
Variables d'environnement
Parfois, dans les scripts shell, il est nécessaire de travailler avec certaines données système. Voici comment afficher le répertoire personnel de l'utilisateur actuel :
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Notez que nous pouvons utiliser une variable système $HOME entre guillemets, cela n'empêchera pas le système de la reconnaître. Voici ce qui se passe si vous exécutez le script ci-dessus.

Utilisation d'une variable d'environnement dans un script
Et si nous devions afficher le symbole dollar à l'écran ? Essayons ceci :
echo "I have $1 in my pocket" Le système détectera le symbole dollar dans la chaîne délimitée par des guillemets et décidera que nous faisons référence à une variable. Le script tentera d'afficher la valeur d'une variable indéfinie $1. Ce n'est pas ce que nous voulons. Que faire ?
Dans une telle situation, l'utilisation du caractère d'échappement, la barre oblique inversée, avant le symbole dollar peut aider :
echo "I have $1 in my pocket"Le script affichera maintenant exactement ce qui est attendu.

Utilisation d'une séquence de contrôle pour afficher le symbole dollar
Variables utilisateur
En plus des variables d'environnement, les scripts bash permettent de définir et d'utiliser des variables personnalisées dans le script. Ces variables conservent leur valeur tant que l'exécution du script n'est pas terminée.
Comme pour les variables système, vous pouvez accéder aux variables personnalisées en utilisant le symbole dollar :
TNW-CUS-FMP — un code promo pour une réduction de 10% sur nos services, valable pendant 7 jours
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Voici ce que vous obtiendrez après l'exécution d'un tel script.

Variables personnalisées dans le script
Substitution de commandes
L'une des fonctionnalités les plus utiles des scripts bash est la capacité d'extraire des informations de la sortie des commandes et de les assigner à des variables, ce qui permet d'utiliser ces informations n'importe où dans le fichier du script.
Cela peut être fait de deux manières.
- En utilisant le symbole de l'apostrophe inversée « ` »
- En utilisant la construction
$()
En utilisant la première approche, assurez-vous de ne pas entrer de quote simple à la place de l'apostrophe inversée. La commande doit être entourée de deux de ces symboles :
mydir=`pwd`Avec la deuxième approche, cela s'écrit de la manière suivante :
mydir=$(pwd)Le script peut donc finalement ressembler à cela :
#!/bin/bash
mydir=$(pwd)
echo $mydir Au cours de son exécution, la sortie de la commande pwdsera sauvegardée dans la variable mydir, dont le contenu sera affiché à la console à l'aide de la commande echo.

Un script qui sauvegarde 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 du type $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Opérations mathématiques dans le script
Construction de contrôle if-then
Dans certains scripts, il est nécessaire de contrôler le flux d'exécution des commandes. Par exemple, si une certaine valeur est supérieure à cinq, une action doit être effectuée, sinon une autre. Cela s'applique à de nombreuses situations, et ici, la construction de contrôle if-then. À son niveau le plus simple, elle se présente comme suit :
if commande
then
commandes
fiVoici un exemple pratique :
#!/bin/bash
if pwd
then
echo "It works"
fi Dans ce cas, si l'exécution de la commande pwdse termine avec succès, le texte « it works » sera affiché dans la console.
Utilisons nos connaissances et écrivons un script plus complexe. Disons qu'il faut trouver un utilisateur dans /etc/passwd, et s'il est trouvé, informer qu'il existe.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiVoici ce que cela donne après l'exécution de ce script.

Recherche d'utilisateur
Ici, nous avons utilisé la commande greppour rechercher un utilisateur dans le fichier /etc/passwd. Si la commande grepvous est inconnue, sa description peut être trouvée .
Dans cet exemple, si l'utilisateur est trouvé, le script affichera un message correspondant. Et si l'utilisateur n'est pas trouvé ? Dans ce cas, le script se terminera simplement sans rien nous dire. Nous aimerions qu'il nous informe à ce sujet aussi, donc améliorons le code.
Construction de contrôle if-then-else
Pour que le programme puisse informer à la fois des résultats de recherche réussis et d'un échec, nous utiliserons la construction if-then-else. Voici comment elle est structurée :
if commande
then
commandes
else
commandes
fi Si la première commande renvoie zéro, ce qui signifie son exécution réussie, la condition sera vraie et l'exécution ne suivra pas la branche sinon. Dans le cas contraire, si quelque chose de différent de zéro est retourné, ce qui indiquera un échec ou un résultat faux, les commandes situées après sinon.
seront exécutées.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Écrivons un tel script : sinon.

Exécution du script avec la construction if-then-else
Continuons notre chemin et posons-nous la question de conditions plus complexes. Que faire si nous devons vérifier non pas une condition, mais plusieurs ? Par exemple, si l'utilisateur requis est trouvé, nous devrions afficher un message, si une autre condition est remplie — un autre message, et ainsi de suite. Dans une telle situation, les conditions imbriquées nous seront utiles. Voici à quoi cela ressemble :
if commande1
then
commandes
elif commande2
then
commandes
fi Si la première commande renvoie zéro, ce qui indique son succès, les commandes dans le premier bloc seront exécutées. alors, sinon, si la première condition s'avère 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 donné aucun résultat, ou faire quelque chose d'utile.
Comparaison de nombres
Dans les scripts, il est possible de comparer des valeurs numériques. Voici une liste des commandes correspondantes.
n1 -eq n2Retourne la valeur vraie sin1est égal àn2.
n1 -ge n2Retourne la valeur vraie sin1est supérieur ou égal àn2.
n1 -gt n2Retourne la valeur vraie sin1ne nécessite plusn2.
n1 -le n2Retourne la valeur vraie sin1est inférieur ou égal àn2.
n1 -lt n2Retourne la valeur vraie si n1 est inférieur àn2.
n1 -ne n2Retourne la valeur vraie sin1n'est pas égal àn2.
Prenons un exemple en utilisant 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"
fiVoici ce que retournera cette commande.

Comparaison de nombres dans les scripts
La valeur de la variable val1est supérieure à 5, par conséquent, la branche de l'opérateur de comparaison sera exécutée et un message correspondant sera affiché dans la console. alorsComparaison de chaînes
Dans les scripts, il est également possible de comparer des valeurs de chaînes. Les opérateurs de comparaison semblent assez simples, cependant, les opérations de comparaison de chaînes ont certaines spécificités que nous aborderons ci-dessous. Voici la liste des opérateurs.
str1 = str2
Vérifie l'égalité des chaînes, retourne vrai si les chaînes sont identiques.tr1 != str2
sRetourne vrai si les chaînes ne sont pas identiques.str1 < str2
Retourne vrai sistr1est inférieur àstr2str1 > str2.
est supérieur àstr1est inférieur à-n str1str1 > str2.
Retourne vrai si la longueurest supérieure à zéro.est inférieur à-z str1
est égale à zéro.est supérieure à zéro.est inférieur àVoici un exemple de comparaison de chaînes dans un script :
En exécutant le script, nous obtiendrons ce qui suit.
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiComparaison de chaînes dans les scripts

Comparaison de chaînes dans les scripts
Voici une particularité de la comparaison de chaînes qu'il convient de mentionner. En effet, les opérateurs «>» et «» 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 de l'exécution du script.

Comparaison de chaînes, avertissement affiché
Notez que le script, bien qu'il s'exécute, génère un avertissement :
./myscript: ligne 5: [: trop d'arguments Pour se débarrasser de cet avertissement, entourons $val2 de guillemets :
#!/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.

Dans les scripts, il est également possible de comparer des valeurs de chaînes. Les opérateurs de comparaison semblent assez simples, cependant, les opérations de comparaison de chaînes ont certaines spécificités que nous aborderons ci-dessous. Voici la liste des opérateurs.
Une autre particularité des opérateurs «>» et «<» réside dans leur fonctionnement avec les symboles en majuscules et minuscules. Pour comprendre cette particularité, préparons un fichier texte avec ce contenu :
Likegeeks
likegeeks Enregistrons-le en lui donnant le nom myfile, puis exécutons la commande suivante dans le terminal :
sort myfileElle triera les chaînes du fichier comme suit :
likegeeks
Likegeeks Commande sort, par défaut, trie les chaînes par ordre croissant, c'est-à-dire que la lettre minuscule dans notre exemple est inférieure à la 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 nous l'exécutons, il s'avère que tout est inversé : la lettre minuscule est maintenant plus grande que la majuscule.

Commande sort et comparaison de chaînes dans le fichier de script
Dans les commandes de comparaison, les lettres majuscules sont inférieures aux lettres minuscules. La comparaison des chaînes se fait ici par la comparaison des codes ASCII des symboles, l'ordre de tri dépend donc des codes des symboles.
Commande sort, à son tour, utilise l'ordre de tri défini dans les paramètres de la langue système.
Vérifications des fichiers
Les commandes ci-dessous sont probablement les plus utilisées dans les scripts bash. Elles permettent de vérifier différentes conditions concernant les fichiers. Voici la liste de ces commandes.
-d fichierVérifie si le fichier existe et s'il s'agit d'un répertoire.
-e fichierVérifie si le fichier existe.
-f fichierVérifie si le fichier existe et s'il s'agit d'un fichier.
-r fichierVérifie si le fichier existe et s'il est lisible.
-s fichierVérifie si le fichier existe et s'il n'est pas vide.
-w fichierVérifie si le fichier existe et s'il est writable.
-x fichierVérifie si le fichier existe et s'il est exécutable.
fichier1 -nt fichier2Vérifie si c'est plus récent quefile1, quefile2.
file1 -ot file2Vérifie si c'est plus ancien quefile1, quefile2.
-O fileVérifie si le fichier existe et si l'utilisateur actuel en est le propriétaire.
-G fileVérifie si le fichier existe et si son identifiant de groupe correspond à celui de l'utilisateur actuel.
Ces commandes, comme beaucoup d'autres que nous avons abordées aujourd'hui, ne sont pas difficiles à retenir. Leurs noms, étant des abréviations de différents mots, indiquent clairement les vérifications qu'elles effectuent.
Testons 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.

Affichage du contenu du répertoire
Nous pensons que vous pourrez expérimenter avec les autres commandes par vous-même, elles s'appliquent toutes selon le même principe.
Résultats
Aujourd'hui, nous avons parlé de la façon de commencer à écrire des scripts bash et avons examiné quelques éléments de base. En réalité, le sujet de la programmation bash est énorme. Cet article est une traduction de la première partie d'une grande série de 11 matériaux. Si vous voulez la suite tout de suite, voici la liste des originaux de ces matériaux. Pour votre confort, celui que vous venez de lire est également inclus.
- — il s'agit de la façon de commencer à créer des scripts bash, de l'utilisation des variables, des structures conditionnelles, des calculs, des comparaisons de nombres, de chaînes, et de la façon d'obtenir des informations sur les fichiers.
- — ici, nous dévoilons les particularités du travail avec les boucles for et while.
- — ce matériel est dédié aux paramètres de ligne de commande et aux clés pouvant être passées aux scripts, au travail avec les données saisies par l'utilisateur et pouvant être lues à partir de fichiers.
- — ici, nous parlons des descripteurs de fichiers et de leur utilisation, des flux d'entrée, de sortie, d'erreur, et du rediriger la sortie.
- — ce matériel est dédié aux signaux Linux, à leur traitement dans les scripts, à l'exécution de scénarios programmés.
- — ici, vous pouvez apprendre à créer et utiliser des fonctions dans des scripts, à développer des bibliothèques.
- — cet article est dédié au travail avec l'éditeur de texte en flux sed.
- — ce matériel est consacré à la programmation dans le langage de traitement de données awk.
- — ici, vous pouvez lire sur l'utilisation des expressions régulières dans les scripts bash.
- — ici, des techniques de gestion des messages envoyés aux utilisateurs et une méthode de surveillance du disque sont présentées.
- — ce matériel est consacré à l'outil Expect, qui permet d'automatiser l'interaction avec des utilitaires interactifs. En particulier, il aborde les scripts expect et leur interaction avec des scripts bash et d'autres programmes.
Nous pensons que l'une des propriétés précieuses de cette série d'articles est qu'elle commence par les concepts les plus simples, adaptés à tout utilisateur, et conduit progressivement à des sujets assez sérieux, offrant à tous les intéressés la possibilité d'avancer dans la création de scripts en ligne de commande Linux.
Chers lecteurs ! Nous demandons aux gourous de la programmation bash de partager comment ils ont atteint les sommets de leur maîtrise, de révéler leurs secrets, et nous attendons les impressions de ceux qui viennent d'écrire leur premier script.
Seuls les utilisateurs enregistrés peuvent participer au sondage. , s'il vous plaît.
Devrions-nous traduire les autres parties de la série d'articles ?
Oui !
Non, ce n'est pas nécessaire
1030 utilisateurs ont voté. 106 utilisateurs se sont abstenus.
Source : habr.com
