9 exemples de scripts Bash pour démarrer sur Linux

0
49
fatmawati achmad zaenuri/Shutterstock.com

Si vous débutez avec les scripts Bash sous Linux, une bonne compréhension des bases vous sera très utile. Ils sont la base d'une connaissance approfondie et de compétences de script supérieures.

N'oubliez pas, rendez vos scripts exécutables

Pour que le shell exécuter un script, le script doit avoir le jeu d'autorisations de fichier exécutable. Sans cela, votre script n'est qu'un fichier texte. Avec lui, c'est toujours un fichier texte, mais le shell sait qu'il contient des instructions et essaiera de les exécuter au lancement du script.

L'intérêt d'écrire des scripts est qu'ils s'exécutent, donc la première étape de base est de savoir comment faire savoir à Linux que votre script doit être considéré comme exécutable.

La commande chmod nous permet de définir les autorisations de fichiers. L'autorisation d'exécution peut être définie avec le drapeau +x.

chmod +x script1.sh

Vous devrez le faire pour chacun de vos scripts. Remplacez “script1.sh” avec le nom de votre script.

1. Qu'est-ce que cette étrange première ligne ?

La première ligne d'un script indique au shell quel interpréteur doit être appelé pour exécuter ce script. La première ligne doit commencer par un shebang, “#!”, également connu sous le nom de hashbang. Le “#!” indique au shell que cette ligne contient le chemin et le nom de l'interpréteur pour lequel le script a été écrit.

Ceci est important car si vous avez écrit un script à exécuter dans Bash, vous ne voulez pas qu'il soit interprété par un shell différent. Il y a probablement des incompatibilités. Bash, comme la plupart des shells, a ses propres particularités de syntaxe et de fonctionnalité que les autres shells n'auront pas ou auront implémentées différemment.

Lorsque vous exécutez un script, le shell actuel ouvre le script et détermine quel shell ou interpréteur doit être utilisé pour exécuter ce script. Il lance ensuite ce shell et lui transmet le script.

#!/bin/bash echo S'exécute dans $SHELL

La première ligne de ce script peut être lue comme “Utilisez l'interpréteur situé à/bin/bash pour exécuter ce script.”

La seule ligne du script écrit la valeur contenue dans la variable d'environnement $SHELL sur l'écran du terminal. Cela confirme que Bash a été utilisé pour exécuter le script.

./script1.sh

En tant que petite astuce de salon, nous pouvons démontrer que le script est passé à n'importe quel interpréteur que nous sélectionnons.

#!/bin/cat Toutes les lignes de texte sont passées à la commande cat et sont imprimées dans la fenêtre du terminal. Cela inclut la ligne shebang. script2.sh

Ce script est lancé par le shell actuel et transmis à la commande cat. La commande cat “exécute” le script.

Écrire vos shebangs comme ceci suppose que vous savez où se trouve le shell ou un autre interpréteur sur la machine cible. Et 99 % du temps, ça va. Mais certaines personnes aiment couvrir leurs paris et écrire leurs shebangs comme ceci :

#!/usr/bin/env bash echo S'exécutant dans $SHELL script3.sh

Lorsque le script est lancé, le shell recherche l'emplacement du shell nommé. Si le shell se trouve dans un emplacement non standard, ce type d'approche peut éviter un “mauvais interprète” ; erreurs.

N'écoutez pas, il ment !

Sous Linux, il y a toujours plus d'une façon d'écorcher un chat ou de prouver qu'un auteur a tort. Pour être tout à fait factuel, il existe un moyen d'exécuter des scripts sans un shebang et sans les rendre exécutables.

Si vous lancez le shell que vous souhaitez exécuter le script et transmettez le script en tant que paramètre de ligne de commande , le shell lancera et exécutera le script— qu'il soit exécutable ou non. Parce que vous choisissez le shell sur la ligne de commande, il n'y a pas besoin d'un shebang.

Voici le script entier :

echo “J'ai été exécuté par” $SHELL < p>Nous allons utiliser ls pour voir que le script n'est vraiment pas exécutable et lancer Bash avec le nom du script :

ls bash script4.sh

Il existe également un moyen de faire exécuter un script par le shell actuel, et non par un shell lancé spécifiquement pour exécuter le script. Si vous utilisez la commande source, qui peut être abrégée en un seul point “.“, votre script est exécuté par votre shell actuel.

Ainsi, pour exécuter un script sans un shebang, sans l'autorisation du fichier exécutable et sans lancer un autre shell, vous pouvez utiliser l'une de ces commandes :

source script4.sh . script4.sh

Bien que cela soit possible, ce n'est pas recommandé comme solution générale. Il y a des inconvénients.

Si un script ne contient pas de shebang, vous ne pouvez pas dire pour quel shell il a été écrit. Allez-vous vous en souvenir dans un an ? Et sans l'autorisation exécutable définie sur le script, la commande ls ne l'identifiera pas comme un fichier exécutable et n'utilisera pas de couleur pour distinguer le script des fichiers en texte brut.

CONNEXION : Lignes de commande : pourquoi les gens s'en soucient-ils encore ?

2. Impression de texte

Écrire du texte sur le terminal est une exigence courante. Un peu de retour visuel va très loin.

Pour les messages simples, la commande echo suffira. Il permet une certaine mise en forme du texte et vous permet également de travailler avec des variables.

#!/bin/bash echo C'est une chaîne simple. echo “Ceci est une chaîne contenant des 'guillemets simples' donc elle est entourée de guillemets doubles.” echo “Ceci affiche le nom d'utilisateur :” $USER echo -e “L'option -e nous permet d'utiliserndes directives de formatagenpour diviser la chaîne.” ./script5.sh

La commande printf nous offre plus de flexibilité et de meilleures capacités de formatage y compris la conversion des nombres.

Ce script imprime le même nombre en utilisant trois bases numériques différentes. La version hexadécimale est également formatée pour s'imprimer en majuscules, avec des zéros non significatifs et une largeur de trois chiffres.

#!/bin/bash printf “Decimal : %d, Octal : %o, Hexadecimal : %03Xn” 32 32 32 ./script6.sh

Notez que contrairement à echo, vous devez indiquer à printf de démarrer un nouveau ligne avec le “n” jeton.

3. Créer et utiliser des variables

Les variables vous permettent de stocker des valeurs dans votre programme et de les manipuler et de les utiliser. Vous pouvez créer vos propres variables ou utiliser des variables d'environnement pour les valeurs système.

#!/bin/bash millennium_text=”Années depuis le millénaire :” current_time=$( date '+%H:%M:%S' ) todays_date=$( date '+%F' ) year=$( date '+%Y' ) echo “Heure actuelle :” $current_time echo “Date d'aujourd'hui :” $todays_date years_since_Y2K=$(( year – 2000 )) echo $ millennium_text $years_since_Y2K

Ce script crée une variable de chaîne appelée millenium_text. Il contient une ligne de texte.

Il crée ensuite trois variables numériques.

  • La variable current_time est initialisée à l'heure à laquelle le script est exécuté.
  • La variable todays_date est définie sur la date à laquelle le script est exécuté.
  • La variable year contient l'année en cours.

Pour accéder à la valeur stockée dans une variable , faites précéder son nom du signe dollar “$.”

./script7.sh

Le script imprime l'heure et la date, puis calcule combien d'années se sont écoulées depuis le millénaire, et les stocke dans years_since_Y2K variable.

Enfin, il imprime la chaîne contenue dans la variable millennium_text et la valeur numérique stockée dans years_since_Y2K.

RELATED : Comment Travailler avec des variables dans Bash

4. Gestion des entrées utilisateur

Pour permettre à un utilisateur de saisir une valeur que le script utilisera, vous devez être en mesure de capturer la saisie au clavier de l'utilisateur. La commande de lecture Bash nous permet de faire exactement cela. Voici un exemple simple.

#!/bin/bash echo “Entrez un nombre et appuyez sur “Entrée”” read user_number1; echo “Entrez un autre numéro et appuyez sur “Entrée”” read user_number2; printf “Vous avez entré : %d et %dn” $user_number1 $user_number2 printf “En additionnant, ils font : %dn” $(( user_number1 + user_number2))

Le script demande deux nombres. Ils sont lus à partir du clavier et stockés dans deux variables, user_number1 et user_number2 .

Le script imprime les nombres dans la fenêtre du terminal, les additionne et imprime le total.

./script8. sh

Nous pouvons combiner les invites dans les commandes de lecture à l'aide de l'option -p (invite).

#!/bin/bash read -p “Entrez un nombre et appuyez sur “Entrée” ” user_number1; read -p “Entrez un autre numéro et appuyez sur “Entrée” ” user_number2; printf “Vous avez entré : %d et %dn” $user_number1 $user_number2 printf “En additionnant, ils font : %dn” $(( user_number1 + user_number2))

Cela rend les choses plus claires et plus faciles à lire. Les scripts faciles à lire sont également plus faciles à déboguer.

./script9.sh

Le script se comporte légèrement différemment maintenant. L'entrée utilisateur est sur la même ligne que l'invite.

Pour capturer la saisie au clavier sans l'afficher dans la fenêtre du terminal, utilisez l'option -s (silencieuse).

#!/bin/bash read -s -p “Saisissez votre code PIN secret et appuyez sur “Entrée” ” secret_PIN ; printf “nShhh … c'est %dn” $secret_PIN ./script10.sh

Le La valeur d'entrée est capturée et stockée dans une variable appelée secret_PIN , mais elle n'est pas renvoyée à l'écran lorsque l'utilisateur la saisit. Ce que vous en faites ensuite dépend de vous.

5. Accepter les paramètres

Parfois, il est plus pratique d'accepter les entrées de l'utilisateur en tant que paramètres de ligne de commande que d'avoir un script en attente d'entrée. Passer des valeurs à un script est facile. Elles peuvent être référencées dans le script comme s'il s'agissait de n'importe quelle autre variable.

Le premier paramètre devient la variable $1, le deuxième paramètre devient la variable $2, et ainsi de suite. La variable $0 contient toujours le nom du script et la variable $# contient le nombre de paramètres fournis sur la ligne de commande. La variable $@ est une chaîne qui contient tous les paramètres de ligne de commande.

#!/bin/bash printf “Ce script s'appelle : %sn” $0 printf “Vous avez utilisé %d paramètres de ligne de commanden” $# # boucle à travers les variables pour param dans “$@” ; do echo “$param” done echo “Le paramètre 2 était :” $2

Ce script utilise $0 et $# pour afficher des informations. utilise ensuite ?@ pour parcourir tous les paramètres de la ligne de commande. Il utilise $2 pour montrer comment accéder à une seule valeur de paramètre particulière.

./script11.sh

Envelopper plusieurs mots entre guillemets “”” les combine en un seul paramètre.

6. Lire des données à partir de fichiers

Savoir comment lire des données à partir d'un fichier est une grande compétence à avoir. Nous pouvons le faire dans Bash avec une boucle while.

#!/bin/bash LineCount=0 while IFS='' read -r LinefromFile || [[ -n “${LigneduFichier}” ]] ; do ((LineCount++)) echo “Lecture de la ligne $LineCount : ${LinefromFile}” done < “$1”

Nous transmettons le nom du fichier que nous voulons que le script traite en tant que paramètre de ligne de commande. Ce sera le seul paramètre, donc à l'intérieur du script $1 contiendra le nom du fichier. Nous redirigeons ce fichier dans la boucle while.

RELATEDComment Traiter un fichier ligne par ligne dans un script Linux Bash

La boucle while définit le séparateur de champ interne sur une chaîne vide, en utilisant l'affectation IFS=''. Cela empêche la commande de lecture de diviser les lignes au niveau des espaces. Seul le retour chariot à la fin d'une ligne est considéré comme la véritable fin de la ligne.

La clause [[ -n “${LinefromFile}” ]] prend en compte la possibilité que la dernière ligne dans le fichier ne se termine pas par un retour chariot. Même si ce n'est pas le cas, cette dernière ligne sera gérée correctement et traitée comme une ligne normale conforme à POSIX.

./script12.sh twinkle.txt

7. Utilisation de tests conditionnels

Si vous souhaitez que votre script effectue différentes actions pour différentes conditions, vous devez effectuer des tests conditionnels. La syntaxe de test à double crochet offre un nombre impressionnant d'options.

#!/bin/bash price=$1 if [[ price -ge 15 ]] ; puis echo “Trop cher.” else echo “Achetez-le !” fi

Bash fournit un ensemble complet d'opérateurs de comparaison qui vous permettent de déterminer, par exemple, si un fichier existe, si vous pouvez le lire, si vous pouvez y écrire et si un répertoire existe.

Il a également tests numériques pour égal à -qe, supérieur à -gt, inférieur ou égal à -le, etc., bien que vous puissiez également utiliser la notation familière  == , >= , <= .

./script13. sh 13 ./script13.sh 14 ./script13.sh 15 ./script13.sh 16

8. La puissance des boucles for

Répéter des actions encore et encore est mieux accompli en utilisant des boucles. Une boucle for vous permet d'exécuter une boucle plusieurs fois. Cela peut aller jusqu'à un certain nombre, ou jusqu'à ce que la boucle ait parcouru une liste d'éléments.

#!/bin/bash for (( i=0; i<=$1; i++ )) do echo “C-style for loop:” $i done for i in {1..4} do echo “For loop with a range:” $i done for i in “zero” “one” “two” “three” do echo “For loop with a list of words:” $i done website=”How To Geek” for i in $website do echo “Boucle for avec une collection de mots :” $i done

Toutes ces boucles sont des boucles for, mais elles fonctionnent avec différents types d'instructions de boucle et de données.

./script14.sh 3

La première boucle est une boucle for de style C classique. Le compteur de boucle i est initialisé à zéro, et incrémenté à chaque cycle de la boucle. Tant que la valeur de i est inférieure ou égale à la valeur contenue dans $1, la boucle continuera à s'exécuter.

La deuxième boucle fonctionne sur la plage de nombres de 1 à 4. La troisième boucle fonctionne sur une liste de mots. Tant qu'il y a plus de mots à traiter, la boucle continue de se répéter.

La dernière boucle parcourt la liste de mots dans une variable de chaîne.

9. Fonctions

Les fonctions vous permettent d'encapsuler des sections de code dans des routines nommées qui peuvent être appelées de n'importe où dans votre script.

Supposons que nous voulions que notre script qui lit les lignes d'un fichier effectue une sorte de traitement sur chaque ligne. Il serait pratique d'avoir ce code contenu dans une fonction.

#!/bin/bash LineCount=0 function count_words() { printf “%d mots dans la ligne %dn” $(echo $1 | wc – w) $2 } tandis que IFS='' read -r LinefromFile || [[ -n “${LigneduFichier}” ]] ; faire ((LineCount++)) count_words “$LinefromFile” $LineCount done < “$1” count_words “Ce n'est pas dans la boucle” 99

Nous avons modifié notre programme de lecture de fichiers en ajoutant une fonction appelée count_words. Elle est définie avant que nous ayons besoin de l'utiliser.

La définition de la fonction commence par le mot fonction. Ceci est suivi d'un nom unique pour notre fonction suivi de parenthèses “().” Le corps de la fonction est contenu entre accolades “{}.”

La définition de la fonction ne provoque l'exécution d'aucun code. Rien dans la fonction n'est exécuté tant que la fonction n'est pas appelée.

La fonction count_words imprime le nombre de mots dans une ligne de texte et le numéro de ligne. Ces deux paramètres sont passés dans la fonction tout comme les paramètres sont passés dans un script. Le premier paramètre devient la variable de fonction $1, et le deuxième paramètre devient la variable de fonction $2, et ainsi de suite.

La boucle while lit chaque ligne du fichier et la transmet à la fonction count_words, avec le numéro de ligne . Et juste pour montrer que nous pouvons appeler la fonction à partir de différents endroits dans le script, nous l'appelons une fois de plus en dehors de la boucle while.

./script15.sh twinkle.txt

Ne craignez pas la courbe d'apprentissage

Le script est gratifiant et utile, mais difficile à comprendre. Une fois que vous aurez acquis des techniques réutilisables, vous pourrez écrire des scripts intéressants assez facilement. Ensuite, vous pouvez vous pencher sur des fonctionnalités plus avancées.

Marchez avant de pouvoir courir et prenez le temps de profiter du voyage.

RELATED : 10 Commandes Linux de base pour les débutants

LIRE SUIVANT

  • › Les 10 meilleurs films originaux de Netflix en 2022
  • › "Atari était très, très dur" Nolan Bushnell sur Atari, 50 ans plus tard
  • &rsaquo ; Combien coûte la recharge d'une batterie ?
  • &rsaquo ; Jusqu'où peut aller une voiture électrique avec une seule charge ?
  • › Examen de la carte de capture NZXT Signal 4K30 : images de haute qualité sans perte
  • &rsaquo ; Acheter un Mac ? Une puce de base M1 ou M2 est probablement tout ce dont vous avez besoin