Introduction aux extensions des paramètres de coquille bash
- 870
- 17
- Clara Nguyen
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
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