Introduction aux extensions des paramètres de coquille bash

Introduction aux extensions des paramètres de coquille bash

Un shell est une partie cruciale d'un système d'exploitation basé sur UNIX et est l'interface principale que nous pouvons utiliser pour interagir avec le système lui-même. Bash est sans aucun doute le shell le plus utilisé sur la majorité des distributions Linux: il est né en tant que remplacement du logiciel sans Obus de Bourne (Bash est l'acronyme de Bourne-Again Shell) à l'intérieur du projet GNU. Dans ce tutoriel, nous apprendrons comment fonctionne certaines des extensions de bash les plus utiles.

Dans le cas où vous n'êtes pas encore familier avec Bash, ou si vous avez simplement besoin de rafraîchir votre mémoire, vous êtes recommandé de visiter notre tutoriel de script bash pour les débutants, avant de plonger dans le concept d'extensions de coquille bash ci-dessous.

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser diverses extensions de paramètres bash



Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution
Logiciel Une coquille bash
Autre Connaissance de base de Bash
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

L'expansion la plus simple possible

La syntaxe d'expansion des paramètres la plus simple possible est la suivante:

$ paramètre

Lorsque nous utilisons cette syntaxe, paramètre est remplacé par sa valeur. Voyons un exemple:

$ site = "LinuxConfig.org "$ echo" $ site "LinuxConfig.org

Nous avons créé le placer variable et attribué le "LinuxConfig.org " chaîne vers lui. Nous avons ensuite utilisé le écho commande pour afficher le résultat de l'expansion variable. Étant une expansion de base, cela aurait fonctionné même sans l'utilisation de accolades autour du nom de la variable:

$ echo "$ site" LinuxConfig.org


Pourquoi avons-nous utilisé le accolades alors? Les accolades bouclées, lors des extensions de paramètres de réalisation, sont utilisées pour délimiter le nom de la variable:

$ echo "Vous lisez cet article sur $ site_!"Vous lisez cet article sur

Ce qui s'est passé? Puisque le nom de variable n'a pas été délimité, le _ Le caractère était considéré comme faisant partie de celui-ci. La coquille a tenté de développer de la $ site_ variable, donc rien n'a été retourné. Envelopper la variable avec des accolades bouclées résout ce problème:

$ echo "Vous lisez cet article sur $ site _!"Vous lisez cet article sur LinuxConfig_!

Bien que l'utilisation des accolades bouclées ne soit pas toujours nécessaire avec l'expansion de base des paramètres, il est obligatoire d'effectuer toutes les autres extensions que nous verrons dans cet article.

Avant de continuer plus loin, laissez-moi vous donner un conseil. Dans l'exemple ci-dessus, la coquille a tenté d'étendre une variable inexistante, produisant un résultat vide. Cela peut être très dangereux, surtout lorsque vous travaillez avec des noms de chemin, par conséquent, lors de l'écriture de scripts, il est toujours recommandé d'utiliser le nom Option qui provoque la sortie du shell avec une erreur chaque fois qu'une variable non existante est référencée:

$ set -o nom $ echo "Vous lisez cet article sur $ site_!"bash: site_: variable non liée

Travailler avec l'indirection

L'utilisation du $ !paramètre Syntaxe, ajoute un niveau d'indirection à notre expansion de paramètre. Qu'est-ce que ça veut dire? Le paramètre que le shell tentera d'étendre n'est pas paramètre ; il essaiera plutôt d'utiliser la valeur de paramètre Comme le nom de la variable à étendre. Expliquons cela avec un exemple. Nous connaissons tous le MAISON La variable développe le chemin du répertoire de la maison utilisateur dans le système, à droite?

$ echo "$ home" / home / egdoc

Très bien, si maintenant nous attribuons la chaîne «Accueil», à une autre variable, et utilisons ce type d'expansion, nous obtenons:

$ variable_to_inspect = "home" $ ​​echo "$ !variable_to_inspect "/ home / egdoc

Comme vous pouvez le voir dans l'exemple ci-dessus, au lieu d'obtenir une «maison» en conséquence, comme cela se serait produit si nous effectuions une expansion simple, le shell a utilisé la valeur de variable_to_inspect Comme le nom de la variable pour se développer, c'est pourquoi nous parlons d'un niveau d'indirection.

Extension de modification des cas

Cette syntaxe d'expansion des paramètres nous a permis de changer le cas des caractères alphabétiques à l'intérieur de la chaîne résultant de l'expansion du paramètre. Dites que nous avons une variable appelée nom; Pour capitaliser le texte renvoyé par l'expansion de la variable, nous utiliserions le $ paramètre ^ syntaxe:

$ name = "egidio" $ echo "$ name ^" egidio

Et si nous voulons en maîtriser la chaîne entière, au lieu de la capitaliser? Facile! nous utilisons le $ paramètre ^^ syntaxe:

$ echo "$ name ^^" egidio

De même, pour minuscule le premier caractère d'une chaîne, nous utilisons le $ paramètre, Syntaxe d'extension:

$ name = "egidio" $ echo "$ name," egidio

Pour minuscule toute la chaîne, nous utilisons plutôt le $ paramètre ,, syntaxe:

$ name = "egidio" $ echo "$ name ,," egidio

Dans tous les cas modèle Pour correspondre à un seul caractère peut également être fourni. Lorsque le modèle est fourni, l'opération est appliquée uniquement aux parties de la chaîne d'origine qui la correspond:

$ name = "egidio" $ echo "$ name ,, [dio]" egidio


Dans l'exemple ci-dessus, nous enfermons les personnages entre crochets: cela fait correspondre à quiconque.

Lors de l'utilisation des extensions que nous avons expliquées dans ce paragraphe et le paramètre est un tableau indiqué par @ ou *, L'opération est appliquée à tous les éléments qui y sont contenus:

$ my_array = (un deux trois) $ echo "$ my_array [@] ^^" un deux trois

Lorsque l'index d'un élément spécifique dans le tableau est référencé, à la place, l'opération est appliquée uniquement à lui:

$ my_array = (un deux trois) $ echo "$ my_array [2] ^^" trois

Retrait de la substrat

La syntaxe suivante que nous examinerons nous permet de supprimer un modèle du début ou de la fin de la chaîne résultant de l'expansion d'un paramètre.

Supprimer le modèle de correspondance du début de la chaîne

La syntaxe suivante que nous examinerons, $ paramètre # modèle, nous permet de supprimer un modèle du début de la
chaîne résultant du paramètre expansion:

$ name = "egidio" $ echo "$ name # egi" dio

Un résultat similaire peut être obtenu en utilisant le "$ Paramètre ## Pattern" syntaxe, mais avec une différence importante: contraire à celle que nous avons utilisée dans l'exemple ci-dessus, qui supprime le modèle de correspondance le plus court Depuis le début de la chaîne, il supprime le le plus long un. La différence est clairement visible lors de l'utilisation du * caractère dans le modèle:

$ name = "egidio docile" $ echo "$ name # * i" dio docile

Dans l'exemple ci-dessus, nous avons utilisé * Dans le cadre du modèle qui doit être retiré de la chaîne résultant par l'expansion du nom variable. Ce magazine correspond à n'importe quel personnage, donc le modèle lui-même se traduit par un personnage «« i »et tout ce qui avant». Comme nous l'avons déjà dit, lorsque nous utilisons le $ paramètre # modèle Syntaxe, le modèle de correspondance le plus court est supprimé, dans ce cas, c'est «EGI». Voyons ce qui se passe lorsque nous utilisons le "$ Paramètre ## Pattern" syntaxe à la place:

$ name = "egidio docile" $ echo "$ name ## * i" le

Cette fois, le modèle de correspondance le plus long est supprimé («egidio doci»): le match le plus long possible comprend le troisième «i» et tout ce qui avant lui. Le résultat de l'expansion est juste «LE».

Supprimer le motif de correspondance de la fin de la chaîne

La syntaxe que nous avons vue ci-dessus supprime le motif de correspondance le plus court ou le plus long du début de la chaîne. Si nous voulons que le motif soit supprimé du fin de la chaîne, nous devons plutôt utiliser le $ paramètre% modèle ou $ Paramètre %% PORTL extensions, pour supprimer respectivement la correspondance la plus courte et la plus longue de la fin de la chaîne:

$ name = "egidio docile" $ echo "$ name% i *" egidio doc

Dans cet exemple, le modèle que nous avons fourni traduit grossièrement par le caractère «« i »et tout après le début de la fin de la chaîne». Le match le plus court est «ile», donc ce qui est retourné est «Egidio Doc». Si nous essayons le même exemple, mais nous utilisons la syntaxe qui supprime la plus longue correspondance que nous obtenons:

$ name = "egidio docile" $ echo "$ name %% i *" par exemple

Dans ce cas, une fois le match le plus long supprimé, ce qui est retourné est «par exemple».

Dans toutes les extensions que nous avons vues ci-dessus, si paramètre est un tableau et il est indiqué avec * ou @, La suppression du modèle d'appariement est appliquée à tous ses éléments:

$ my_array = (un deux trois) $ echo "$ my_array [@] # * o" ne trois


Recherche et remplacer le modèle

Nous avons utilisé la syntaxe précédente pour supprimer un modèle de correspondance du début ou de la fin de la chaîne résultant de l'expansion d'un paramètre. Et si nous voulons remplacer modèle avec autre chose? Nous pouvons utiliser le $ paramètre / modèle / chaîne ou $ Paramètre // Pattern / String syntaxe. Le premier ne remplace que la première occurrence du motif, la seconde toutes les occurrences:

$ phrase = "jaune est le soleil et le jaune est le citron" $ echo "$ phrase / jaune / rouge" Le rouge est le soleil et le jaune est le citron

Le paramètre (phrase) est élargi, et la plus longue correspondance du modèle (jaune) est jumelé contre lui. Le match est ensuite remplacé par le fourni chaîne (rouge). Comme vous pouvez observer uniquement, la première occurrence est remplacée, donc le citron reste jaune! Si nous voulons changer toutes les occurrences du motif, nous devons le préfixer avec le / / personnage:

$ phrase = "jaune est le soleil et le jaune est le citron" $ echo "$ phrase // jaune / rouge" rouge est le soleil et le rouge est le citron

Cette fois, toutes les occurrences de «jaune» ont été remplacées par «rouge». Comme vous pouvez le voir, le modèle est apparié partout où il se trouve dans la chaîne résultant de l'expansion de paramètre. Si nous voulons spécifier qu'il ne doit être égalé qu'au début ou à la fin de la chaîne, nous devons le préfixer respectivement avec le # ou % personnage.

Comme dans les cas précédents, si paramètre est un tableau indiqué par l'un ou l'autre * ou @, La substitution se produit dans chacun de ses éléments:

$ my_array = (un deux trois) $ echo "$ my_array [@] / o / u" une twu trois

Expansion de la substrat

Le $ Paramètre: Offset et $ paramètre: décalage: longueur les extensions nous élargissons une partie du paramètre, renvoyant une sous-chaîne à partir de la compenser et longueur Longs caractères. Si la longueur n'est pas spécifiée, l'extension se déroule jusqu'à la fin de la chaîne d'origine. Ce type d'expansion est appelé Expansion de la substrat:

$ name = "egidio docile" $ echo "$ name: 3" dio docile

Dans l'exemple ci-dessus, nous avons fourni uniquement le compenser, sans spécifier le longueur, Par conséquent, le résultat de l'expansion a été la sous-chaîne obtenue en commençant par le caractère spécifié par le décalage (3).

Si nous spécifions une longueur, la sous-chaîne commencera à compenser et sera longueur Longs caractères:

$ echo "$ name: 3: 3" dio 

Si la compenser est négatif, il est calculé à partir de la fin de la chaîne. Dans ce cas, un espace supplémentaire doit être ajouté après : sinon le shell le considérera comme un autre type d'expansion identifié par :- qui est utilisé pour fournir une valeur par défaut si le paramètre à étendre n'existe pas (nous en avons parlé dans l'article sur la gestion de l'expansion des variables de bash vide ou non

$ echo "$ name: -6" docile

Si le fourni longueur est négatif, au lieu d'être interprété comme le nombre total de caractères que la chaîne résultante doit être longue, elle est considérée comme un décalage à calculer à partir de la fin de la chaîne. Le résultat de l'expansion sera donc une sous-chaîne à partir de compenser et se terminant à longueur Caractères de la fin de la chaîne originale:

$ echo "$ name: 7: -3" doc 

Lorsque vous utilisez cette expansion et paramètre est un tableau indexé souscrit par * ou @, le compenser est relatif aux indices des éléments de tableau. Par exemple:

$ my_array = (un deux trois) $ echo "$ my_array [@]: 0: 2" un deux $ echo "$ my_array [@]: -2" Two trois


Un négatif longueur , Au lieu de cela, génère une erreur d'extension:

$ echo "$ my_array [@]: 0: -2" bash: -2: expression de sous-chaîne < 0 

Extension «longueur»

Lorsque vous utilisez le $ # paramètre Extension, le résultat de l'expansion n'est pas la valeur du paramètre, par sa longueur:

$ name = "egidio" $ echo "$ # name" 6

Quand paramètre est un tableau, et il est indiqué avec * ou @, Le nombre des éléments qui y contenaient est retourné:

$ my_array = (un deux trois) echo "$ # my_array [@]" 3

Lorsqu'un élément spécifique du tableau est référencé, sa longueur est retournée à la place:

$ echo "$ # my_array [2]" 5

Assembler

Dans cet article, nous avons vu de nombreuses syntaxes d'extensions. Nous avons vu comment en minuscules ou en maître faire en sorte qu'un paramètre soit élargi dans la longueur de sa valeur, au lieu de sa valeur elle-même.

Ce n'est pas une liste exhaustive de toutes les extensions possibles que nous pouvons effectuer avec Bash: Consultez la documentation GNU si vous voulez en savoir plus. Dans l'article que nous avons également mentionné tableaux de bash: Pour en savoir plus à leur sujet, vous pouvez lire notre article dédié à des tableaux de bash.

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Ubuntu 20.04 Guide
  • Choses à installer sur Ubuntu 22.04
  • Installez Arch Linux dans VMware Workstation
  • Téléchargement Linux