Guide du débutant pour l'écriture de scripts shell
Le terme «script shell» est souvent mentionné dans les forums Linux, mais de nombreux utilisateurs ne le connaissent pas bien. L'apprentissage de cette méthode de programmation simple et puissante peut vous aider à gagner du temps, à mieux apprendre la ligne de commande et à éliminer les tâches fastidieuses de gestion de fichiers..
Qu'est-ce que Shell Scripting?
Être un utilisateur Linux signifie que vous jouez avec la ligne de commande. Qu'on le veuille ou non, il y a juste des choses qui se font beaucoup plus facilement via cette interface que de pointer et cliquer. Plus vous utilisez et apprenez la ligne de commande, plus vous en voyez le potentiel. Eh bien, la ligne de commande elle-même est un programme: le shell. La plupart des distributions Linux utilisent aujourd'hui Bash, et c’est ce que vous entrez réellement dans les commandes.
Certains d’entre vous qui utilisaient Windows avant d’utiliser Linux se souviennent peut-être des fichiers de commandes. C'étaient de petits fichiers texte que vous pouviez remplir avec des commandes à exécuter et Windows les exécuterait à leur tour. C’était un moyen astucieux et astucieux d’effectuer certaines tâches, comme lancer des jeux dans votre laboratoire informatique de lycée quand vous ne pouviez pas ouvrir de dossiers système ni créer de raccourcis. Les fichiers batch dans Windows, bien qu'utiles, constituent une imitation peu coûteuse des scripts shell.
Les scripts shell nous permettent de programmer des commandes dans des chaînes et de les exécuter comme un événement écrit par script, tout comme des fichiers de commandes. Ils permettent également des fonctions beaucoup plus utiles, telles que la substitution de commande. Vous pouvez appeler une commande, telle que la date, et utiliser sa sortie dans le cadre d'un schéma de dénomination de fichier. Vous pouvez automatiser les sauvegardes et la date du jour peut être ajoutée à la fin du nom de chaque fichier copié. Les scripts ne sont pas simplement des invocations de commandes. Ce sont des programmes à part entière. La création de scripts vous permet d'utiliser des fonctions de programmation - telles que des boucles "pour", des instructions if / then / else, etc. directement dans l'interface de votre système d'exploitation. Et vous ne devez pas apprendre une autre langue car vous utilisez ce que vous savez déjà: la ligne de commande.
C'est vraiment le pouvoir du script, je pense. Vous pouvez programmer avec les commandes que vous connaissez déjà, tout en apprenant les bases de la plupart des principaux langages de programmation. Besoin de faire quelque chose de répétitif et fastidieux? Scriptez-le! Besoin d'un raccourci pour une commande vraiment compliquée? Scriptez-le! Vous souhaitez créer une interface de ligne de commande vraiment facile à utiliser? Écris le!
Avant que tu commences
Avant de commencer notre série de scripts, couvrons quelques informations de base. Nous utiliserons le shell bash, que la plupart des distributions Linux utilisent en mode natif. Bash est également disponible pour les utilisateurs de Mac OS et Cygwin sous Windows. Comme il est si universel, vous devriez pouvoir écrire un script indépendamment de votre plate-forme. En outre, tant que toutes les commandes référencées existent, les scripts peuvent fonctionner sur plusieurs plates-formes sans nécessiter d'ajustements minimes..
Les scripts peuvent facilement utiliser les privilèges «administrateur» ou «superutilisateur». Il est donc préférable de tester les scripts avant de les utiliser. Faites également preuve de bon sens, comme de vous assurer que vous avez bien sauvegardé les fichiers sur lesquels vous allez exécuter un script. Il est également très important d’utiliser les bonnes options, comme -i pour la commande rm, pour que votre interaction soit indispensable. Cela peut éviter de mauvaises erreurs. En tant que tel, lisez les scripts que vous téléchargez et soyez prudent avec les données que vous avez, juste au cas où quelque chose se passerait mal.
À la base, les scripts ne sont que des fichiers de texte brut. Vous pouvez utiliser n'importe quel éditeur de texte pour les écrire: gedit, emacs, vim, nano… Cette liste est longue. Assurez-vous simplement de l'enregistrer sous forme de texte brut, pas de texte enrichi, ni sous forme de document Word. Puisque j'adore la facilité d'utilisation fournie par nano, j'utiliserai cette.
Autorisations de script et noms
Les scripts sont exécutés comme des programmes et, pour ce faire, ils doivent disposer des autorisations appropriées. Vous pouvez rendre les scripts exécutables en exécutant la commande suivante:
chmod + x ~ / somecrazyfolder / script1
Cela permettra à quiconque d'exécuter ce script particulier. Si vous voulez limiter son utilisation à votre utilisateur, vous pouvez utiliser ceci à la place:
chmod u + x ~ / somecrazyfolder / script1
Pour exécuter ce script, vous devez vous connecter au répertoire approprié, puis exécuter le script de la manière suivante:
cd ~ / somecrazyfolder
./ script1
Pour rendre les choses plus pratiques, vous pouvez placer les scripts dans un dossier «bin» de votre répertoire personnel:
~ / bin
Dans beaucoup de distributions modernes, ce dossier n'est plus créé par défaut, mais vous pouvez le créer. C'est généralement là que sont stockés les fichiers exécutables qui appartiennent à votre utilisateur et non à d'autres utilisateurs. En plaçant les scripts ici, vous pouvez simplement les exécuter en tapant leur nom, comme d’autres commandes, au lieu d’avoir à cd et utiliser le préfixe './'.
Avant de nommer un script, vous devez utiliser la commande suivante pour vérifier si un programme installé utilise ce nom:
qui [commande]
Beaucoup de gens appellent leurs premiers scripts «test» et quand ils essaient de l'exécuter en ligne de commande, rien ne se passe. Cela est dû au fait qu’il entre en conflit avec la commande test, qui ne fait rien sans arguments. Assurez-vous toujours que vos noms de script n'entrent pas en conflit avec les commandes, sinon vous risquez de vous retrouver en train de faire des choses que vous n'avez pas l'intention de faire.!
Directives de script
Comme je l'ai mentionné précédemment, chaque fichier de script est essentiellement du texte brut. Cela ne signifie pas que vous puissiez écrire ce que vous voulez, bon gré mal gré. Lorsque vous tentez d'exécuter un fichier texte, les shells les analysent pour vous aider à savoir s'il s'agit de scripts ou non, et comment gérer le tout correctement. Pour cette raison, il y a quelques directives à connaître..
- Chaque script doit être avec “#! / Bin / bash”
- Chaque nouvelle ligne est une nouvelle commande
- Les lignes de commentaires commencent par un #
- Les commandes sont entourées de ()
Le Hack-Bang Hack
Lorsqu'un shell analyse un fichier texte, le moyen le plus direct d'identifier le fichier en tant que script consiste à insérer votre première ligne:
#! / bin / bash
Si vous utilisez un autre shell, remplacez son chemin ici. Les lignes de commentaire commencent par un hachage (#), mais l'ajout du bang (!) Et du chemin d'accès au shell est une sorte de hack qui contournera cette règle de commentaire et forcera le script à s'exécuter avec le shell vers lequel cette ligne pointe..
Nouvelle ligne = nouvelle commande
Chaque nouvelle ligne doit être considérée comme une nouvelle commande ou un composant d’un système plus vaste. Les instructions if / then / else, par exemple, prendront en charge plusieurs lignes, mais chaque composant de ce système se trouve dans une nouvelle ligne. Ne laissez pas une commande se perdre dans la ligne suivante, car cela pourrait tronquer la commande précédente et vous donner une erreur sur la ligne suivante. Si votre éditeur de texte est en train de le faire, vous devez désactiver le retour à la ligne pour être du côté sûr. Vous pouvez désactiver l'habillage du texte en mode nano en appuyant sur ALT + L.
Commenter souvent avec #s
Si vous démarrez une ligne avec un #, la ligne est ignorée. Cela le transforme en une ligne de commentaire, où vous pouvez vous rappeler ce que la sortie de la commande précédente était ou ce que la commande suivante fera. Encore une fois, désactivez l'habillage du texte ou divisez votre commentaire en plusieurs lignes commençant par un dièse. Il est recommandé de conserver de nombreux commentaires, car cela vous permet, à vous et à d’autres personnes, de modifier vos scripts plus facilement. La seule exception est le hack Hash-Bang susmentionné, ne suivez donc pas #s avec! S. ;-)
Les commandes sont entourées de parenthèses
Dans les jours plus anciens, les substitutions de commandes étaient effectuées avec des graduations simples (', partage la clé ~). Nous n'allons pas encore en parler, mais comme la plupart des gens partent à la découverte des bases, c'est probablement une bonne idée de mentionner que vous devriez plutôt utiliser des parenthèses. Ceci est principalement dû au fait que lorsque vous imbriquez - placez des commandes dans d'autres commandes - les parenthèses fonctionnent mieux.
Votre premier script
Commençons par un script simple qui vous permet de copier des fichiers et d’ajouter des dates à la fin du nom de fichier. Appelons cela «datecp». Premièrement, vérifions si ce nom est en conflit avec quelque chose:
Vous pouvez voir qu'il n'y a pas de sortie de la commande which, nous allons donc tous utiliser ce nom.
Créons un fichier vierge dans le dossier ~ / bin:
touchez ~ / bin / datecp
Et, changeons l'autorisation maintenant, avant d'oublier:
Commençons alors à construire notre script. Ouvrez ce fichier dans l'éditeur de texte de votre choix. Comme je le disais, j'aime la simplicité de nano.
nano ~ / bin / datecp
Et, allons-y et mettons dans la première ligne de prérequis, et un commentaire sur ce que fait ce script.
Ensuite, déclarons une variable. Si vous avez déjà pris de l'algèbre, vous savez probablement ce que c'est. Une variable nous permet de stocker des informations et de faire des choses avec. Les variables peuvent «se développer» lorsqu'elles sont référencées ailleurs. C'est-à-dire qu'au lieu d'afficher leur nom, ils afficheront le contenu stocké. Vous pourrez ultérieurement dire à cette même variable de stocker des informations différentes et toute instruction ultérieure à cette information utilisera les nouvelles informations. C'est un espace réservé vraiment chic.
Que mettrons-nous en variable? Eh bien, enregistrons la date et l'heure! Pour ce faire, nous ferons appel à la commande date.
Jetez un coup d’œil à la capture d’écran ci-dessous pour savoir comment générer le résultat de la commande date:
Vous pouvez constater qu'en ajoutant différentes variables commençant par%, vous pouvez modifier le résultat de la commande selon vos besoins. Pour plus d'informations, vous pouvez consulter la page de manuel pour la commande de date.
Utilisons cette dernière itération de la commande date, «date +% m_% d_% y-% H.% M.% S», et utilisons-la dans notre script.
Si nous sauvegardions ce script maintenant, nous pourrions l'exécuter et cela nous donnerait le résultat de la commande date comme nous nous y attendions:
Mais faisons quelque chose de différent. Donnons un nom de variable, tel que date_formatted à cette commande. La syntaxe appropriée pour cela est la suivante:
variable = $ (arguments -options de la commande)
Et pour nous, nous le construirions comme ceci:
date_formatted = $ (date +% m_% d_% y-% H.% M.% S)
C'est ce que nous appelons la substitution de commande. Nous disons essentiellement à bash que, chaque fois que la variable «date_formatted» apparaît, il faut exécuter la commande entre parenthèses. Ensuite, quelle que soit la sortie fournie par les commandes, elle devrait être affichée à la place du nom de la variable, "date_formatted".
Voici un exemple de script et sa sortie:
Notez qu'il y a deux espaces dans la sortie. L'espace entre les guillemets de la commande echo et l'espace devant la variable sont tous deux affichés. N'utilisez pas d'espaces si vous ne voulez pas qu'ils apparaissent. Notez également que sans cette ligne «echo» ajoutée, le script ne donnerait absolument aucun résultat..
Revenons à notre script. Ajoutons ensuite dans la partie copie de la commande.
cp -iv $ 1 $ 2. $ date_formatted
Ceci invoquera la commande copy, avec les options -i et -v. Le premier vous demandera une vérification avant d'écraser un fichier, et le second affichera ce qui est en train d'être arrêté sur la ligne de commande..
Ensuite, vous pouvez voir que j'ai ajouté l'option «$ 1». Lors de la création d'un script, un signe dollar ($) suivi d'un nombre indiquera cet argument numéroté du script lors de son invocation. Par exemple, dans la commande suivante:
cp -iv Trogdor2.mp3 ringtone.mp3
Le premier argument est “Trogdor2.mp3” et le second argument est “ringtone.mp3”.
En regardant notre script, nous pouvons voir que nous référons deux arguments:
Cela signifie que lorsque nous exécuterons le script, nous devrons fournir deux arguments pour qu'il s'exécute correctement. Le premier argument, $ 1, est le fichier qui sera copié. Il est remplacé par le premier argument de la commande «cp -iv»..
Le deuxième argument, $ 2, agira comme fichier de sortie pour la même commande. Mais vous pouvez aussi voir que c'est différent. Nous avons ajouté un point et nous avons référencé la variable «date_formatted» ci-dessus. Curieux de savoir ce que cela fait?
Voici ce qui se passe lorsque le script est exécuté:
Vous pouvez voir que le fichier de sortie est répertorié comme tout ce que j'ai entré pour $ 2, suivi d'un point, puis du résultat de la commande date! Cela a du sens, juste?
Maintenant, lorsque j'exécute la commande datecp, il exécutera ce script et me permettra de copier tout fichier dans un nouvel emplacement et d'ajouter automatiquement la date et l'heure à la fin du nom du fichier. Utile pour archiver des choses!
Les scripts Shell sont au cœur de la réussite de votre système d'exploitation. Vous n'avez pas non plus besoin d'apprendre un nouveau langage de programmation pour y arriver. Essayez de créer des scripts avec quelques commandes de base chez vous et commencez à penser à ce que vous pouvez utiliser pour.
Avez-vous un script? Avez-vous des conseils pour les débutants? Partagez votre opinion dans les commentaires! Il y a plus à venir dans cette série!