Extension de coquille de bash

Extension de coquille de bash
Dans cet article, nous couvrirons toutes les caractéristiques de base de l'expansion de Bash Shell. Certaines des extensions les plus complexes et les plus intéressantes sont l'expansion et l'expansion des paramètres de l'entret. La division des mots est également assez intéressante et parfois négligée. Le nom de fichier, l'expansion arithmétique et la substitution variable sont bien connus. Nous couvrirons de nombreux sujets et montrerons des exemples de la commande et des syntaxes les plus utiles pour chaque syntaxe. Alors, commençons.
  • Environnement
  • Substitution de commandement
  • Substitution de processus
  • Substitution variable
  • Extension
  • Extension des paramètres
  • Paramètres de position
  • Expansion de Tilde
  • Substitution arithmétique
  • Division des mots
  • Expansion du nom de fichier
  • Conclusion

Environnement

Afin de tester toutes les fonctionnalités d'extensions de Shell Bash, nous devons nous assurer que nous exécutions une version récente de Bash. Vous trouverez ci-dessous les informations système pour cet article. Les tests de cet article fonctionnent sur Ubuntu 19.10 comme indiqué ci-dessous.

$ uname -a
Instance linux-1 5.3.0-1014-GCP # 15-UBUNTU SMP mar 3 mars 04:14:57
UTC 2020 X86_64 X86_64 X86_64 GNU / Linux

La version bash pour ces tests est Bash version 5, qui est assez récente. Les versions plus anciennes de Bash manquent un tas de fonctionnalités.

$ bash --version
GNU Bash, version 5.0.3 (1) -release (x86_64-pc-linux-gnsU)
Copyright (c) 2019 Free Software Foundation, Inc.
Licence GPLV3 +: GNU GPL version 3 ou version ultérieure

Substitution de commandement

La substitution de commandes permet l'exécution d'une ou plusieurs commandes et de capture de sorties et d'actions de ces commandes et de les inclure dans une autre commande toutes en une ligne ou moins que d'exécuter toutes les commandes séparément. La substitution de commande a deux syntaxes; La syntaxe la plus populaire est la syntaxe Backtick où la commande à exécuter est enfermée en deux backQuotes, ou backtincs. L'autre syntaxe qui est tout aussi puissante enferme les commandes dans $ () Syntaxe et la sortie peut être utilisée à partir de cette nouvelle expansion. Regardons un certain nombre d'exemples de substitution de commandement ci-dessous.

Substitution de commande simple utilisant une syntaxe $ () pour exécuter la commande de date.

$ echo $ (date)
Mer 18 mars 01:42:46 UTC 2020

Substitution de commande simple utilisant la syntaxe Backtick pour exécuter la commande de date.

$ echo 'date'
Mer 18 mars 01:43:17 UTC 2020

L'utilisation de l'opérateur stdin au début de la syntaxe de substitution de commande est un moyen sophistiqué de lire le texte d'un fichier dans une variable et de l'utiliser dans une commande sur le shell comme ci-dessous.

$ echo "Hello World"> MyText
$ echo $ (< mytext)
Bonjour le monde

Lisez un fichier dans une variable à utiliser dans une commande en utilisant la commande CAT et la substitution de commande.

$ echo "Hello World"> MyText
$ echo $ (cat mytext)
Bonjour le monde

Identique à ci-dessus, lisez un fichier et utilisez-le dans la substitution de commande à l'aide de backticks et de commande CAT.

$ echo "Hello World"> MyText
$ echo 'cat mytext'
Bonjour le monde

Combinez la substitution de commande embarquée par une autre substitution de commande en utilisant à la fois $ () et des backticks ensemble

$ echo 'echo $ (date) | Cut -d "" -f 1'> myfile
$ Cat myfile
Épouser

Substitution de commande intégrée à l'intérieur d'un autre en utilisant deux opérations de syntaxe $ ()

$ echo "Aujourd'hui est $ (echo $ (date) | Cut -d" "-f 1)"> myfile
$ Cat myfile
Aujourd'hui est marié

Utilisez la sortie d'une commande comme arguments dans une autre commande, avec la syntaxe Backtick. Nous obtiendrons une liste de fichiers en exécutant CAT qui contient un fichier par ligne, puis passerons dans la commande RM qui supprimera chaque fichier

$ toucher un; toucher deux
$ echo un> myfiles; écho deux >> myfiles
$ rm 'chat myfiles'

Identique à ci-dessus mais avec une syntaxe $ (), passez la commande de commande de la commande CAT dans RM pour supprimer les fichiers.

$ toucher un; toucher deux
$ echo un> myfiles; écho deux >> myfiles
$ rm $ (chat myfiles)

Stockez la sortie d'une commande CAT dans une variable, puis parcourez la variable afin que vous puissiez voir plus clairement ce qui se passe.

$ toucher un; toucher deux
$ echo un> myfiles; écho deux >> myfiles
$ Myfiles = $ (Cat myfiles)
$ pour f dans $ myfiles; faire écho $ f; rm $ f; fait
un
deux

Identique à ci-dessus, mais utilisez la syntaxe BackTicks pour exécuter la commande CAT et stocker la sortie dans une variable, puis faire une parcourir dans les fichiers int la variable.

$ toucher un; toucher deux
$ echo un> myfiles; écho deux >> myfiles
$ MyFiles = 'Cat myfiles'
$ pour f dans $ myfiles; faire écho $ f; rm $ f; fait
un
deux

Utilisez la substitution de commande par l'opérateur stdin pour lire un fichier ligne par ligne dans une variable, puis faire passer à travers la variable Afterwords

$ toucher un; toucher deux
$ echo un> myfiles; écho deux >> myfiles
$ Myfiles = $ (< myfiles)
$ pour f dans $ myfiles; faire écho $ f; rm $ f; fait
un
deux

Substitution de processus

La substitution du processus est une caractéristique documentée de Bash; C'est assez cryptique à mon avis. En fait, je n'ai pas trouvé beaucoup de bons cas d'utilisation à recommander. Un exemple est inclus ici pour l'exhaustivité où nous utilisons la substitution de processus pour obtenir la sortie d'une commande, puis l'utiliser une autre commande. Nous imprimerons la liste des fichiers dans l'ordre inverse avec la commande de tri dans cet exemple après avoir récupéré les fichiers de la commande LS.

$ touchez un.SMS; toucher deux.SMS; toucher trois.SMS
$ sort -r <(ls *txt)
deux.SMS
trois.SMS
un.SMS

Substitution variable

La substitution variable est ce que vous pouvez considérer l'utilisation de base des variables et remplacer la valeur de la variable lorsqu'il est référencé. Son assez intuitif, quelques exemples sont fournis ci-dessous.

Affectation et utilisation de variables simples où nous mettons une chaîne dans la variable x, puis l'imprimez sur stdout

$ X = 12345
$ echo $ x
12345

Vérifiez si une variable se voit attribuer quelque chose ou nul, dans ce cas, il est attribué, nous l'imprimons donc à Stdout

$ X = 12345
$ si [-z "$ x"]; Puis écho "x est nul"; else echo $ x; Fi
12345

Vérifiez si une variable se voit attribuer quelque chose ou nul, dans ce cas, il n'est pas défini donc nous imprimons «est nul» au lieu de la valeur.

$ unset x
$ si [-z "$ x"]; Puis écho "x est nul"; else echo $ x; Fi
X est nul

Extension

L'expansion de l'auto. Il a de nombreuses fonctionnalités et options différentes décrites ci-dessous. Dans les accolades, votre syntaxe est interprétée en une syntaxe plus verbeuse selon lorsque vous entrez dans les accolades bouclées. Regardons un certain nombre d'exemples pour l'extension.

Chaque version des éléments de la liste en accolades est exécutée. Nous passons donc d'une commande Echo et imprimez 3 versions du mot ci-dessous séparées par des espaces.

$ echo a, m, p _warehouse
a_warehouse m_warehouse p_warehouse

Les expansions provoquent une exécution plusieurs fois. Pour prouver cela, nous utilisons la commande Date and Sleep pour valider que la commande de date est exécutée une fois pour chaque itération du modèle dans l'extension de l'attelle.

$ echo a, m, p _ $ (date; sommeil 1)
A_SUN 22 mars 18:56:45 UTC 2020 M_SUN 22 mars 18:56:46 UTC
2020 P_SUN 22 mars 18:56:47 UTC 2020

Les extensions utilisant des nombres avec… entraîneront une étendue de nombres séquentiels dans une séquence numérique

$ echo 1… 8 _warehouse
1_warehouse 2_warehouse 3_warehouse 4_warehouse 5_warehouse 6_warehouse 7_warehouse
8_warehouse

Extension de l'entrac

$ echo 8… 1 _warehouse
8_warehouse 7_warehouse 6_warehouse 5_warehouse 4_warehouse 3_warehouse 2_warehouse
1_warehouse

Utilisation d'une valeur d'incrément facultative pour spécifier les incréments numériques de l'extension de l'accident

$ echo 1… 9… 3 _warehouse
1_warehouse 4_warehouse 7_warehouse

L'expansion de l'attelle lexicographique iratera à travers des lettres de l'alphabet dans l'ordre des paramètres régionaux

$ echo a… e _warehouse
a_warehouse b_warehouse c_warehouse d_warehouse e_warehouse

Expansion de l'orthographe lexicographique de l'ordre inversé

$ echo e… a _warehouse
e_warehouse d_warehouse c_warehouse b_warehouse a_warehouse

L'expansion de l'attelle lexicographique avec l'incrément spécifié itérara à travers une liste de caractères du début au point final mais sautera les caractères en fonction de la valeur d'incrément

$ echo a… z… 5 _warehouse
a_warehouse f_warehouse k_warehouse p_warehouse u_warehouse z_warehouse

Extension multiplicative contre les accolades avec 2 extensions de l'attelle dans une commande

$ echo a… e 1… 5 _warehouse
a1_warehouse a2_warehouse a3_warehouse a4_warehouse a5_warehouse b1_warehouse
b2_warehouse b3_warehouse b4_warehouse b5_warehouse c1_warehouse c2_warehouse
c3_warehouse c4_warehouse c5_warehouse d1_warehouse d2_warehouse d3_warehouse
d4_warehouse d5_warehouse e1_warehouse e2_warehouse e3_warehouse e4_warehouse
e5_warehouse

L'extension de l'attelle pour utiliser la même racine deux fois dans une commande. Cela crée un foo.Fichier TGZ TAR à partir d'un répertoire sous nom foo. C'est une syntaxe pratique où vous l'utilisez dans une autre boucle et voulez supposer que la base du mot est utilisée plusieurs fois. Cet exemple le montre avec TAR, mais il peut également être utilisé avec MV et CP selon cet exemple.

$ mkdir foo
$ touch foo / foo a… e
$ TAR CZVF FOO .tgz,
foo /
foo / foob
FOO / FOOC
foo / fooa
foo / nourriture
foo / fooe

Extension des paramètres

L'expansion des paramètres est également une belle syntaxe compacte avec de nombreuses capacités telles que: permettez aux scripts de définir des valeurs par défaut pour les variables ou les options non définies, les opérations de sous-chaîne de chaîne, la recherche et remplacer les substitutions et autres cas d'utilisation. Les exemples sont ci-dessous.
Vérifiez NULL et utilisez le paramètre s'il n'est pas nul ou la valeur par défaut. Dans ce cas, x n'est pas nul donc il sera utilisé

$ X = 1
$ echo $ x: -2
1

Vérifiez NULL et utilisez le paramètre s'il n'est pas nul ou la valeur par défaut. Dans ce cas, x est null, donc la valeur par défaut sera utilisée

$ unset x
$ echo $ x: -2
2

Vérifiez si la variable est nulle et définie et résonne-la si elle est nul. X est attribué 2 et imprimé $ x. Cela peut à la fois définir la variable et l'utiliser dans la commande avec la syntaxe $ : =.

$ unset x
$ si [-z "$ x"]; puis écho null; Fi
NUL
$ echo $ x: = 2
2
$ si [-z "$ x"]; puis écho null; else echo $ x; Fi
2

L'expansion de la sous-chaîne se remplacera à partir d'un point de décalage un certain nombre de caractères dans la chaîne

$ X = "Hello World"
$ echo $ x: 0: 7
Bonjour w

Changez le décalage en deuxième caractère et imprimez 7 caractères de la sous-chaîne

$ X = "Hello World"
$ echo $ x: 1: 7
Ello Wo

Substrat du début de la chaîne mais coupé les 2 derniers caractères

$ X = "Hello World"
$ echo $ x: 0: -2
Bonjour wor

Obtenez une longueur de chaîne avec cette version de l'expansion des paramètres

$ X = "Hello World"
$ echo $ # x
11

Rechercher et remplacer dans une variable. Dans cet exemple, remplacez la première minuscule O par une majusculée O

$ X = "Hello World"
$ echo $ x / o / o
Bonjour le monde

Rechercher et remplacer dans une variable mais avec toutes les correspondances remplacées en raison de la barre de la principale tronc dans le modèle de recherche.

$ X = "Hello World"
$ echo $ x // o / o
Bonjour le monde

Les modèles commençant par #, signifient que le match doit commencer au début de la chaîne afin d'être substitué

$ X = "Hello World"
$ echo $ x / # h / j
Monde jello

Exemple où la recherche de correspondance au début de la chaîne, mais échouant parce que la correspondance est plus tard dans la chaîne

$ X = "Hello World"
$ echo $ x / # w / j
Bonjour le monde

Les modèles commençant par% ne correspondront qu'à la fin de la chaîne comme dans cet exemple.

$ X = "Hello World"
$ echo $ x /% d / d aujourd'hui
Hello World aujourd'hui

Exemple pour la fin de la chaîne Match qui échoue car le match est au début de la chaîne.

$ X = "Hello World"
$ echo $ x /% h / aujourd'hui
Bonjour le monde

Utilisez Shopt avec Nocasematch pour effectuer un remplacement insensible à la caisse.

$ shopt -s nocasematch
$ X = "Hello World"
$ echo $ x / bonjour / bienvenue
Monde de bienvenue

Éteignez Shopt avec Nocasematch pour effectuer un remplacement sensible à la casse.

$ shopt -u nocasematch
$ X = "Hello World"
$ echo $ x / bonjour / bienvenue
Bonjour le monde

Rechercher des variables d'environnement qui correspondent à un modèle.

$ My_a = 1
$ My_b = 2
$ My_c = 3
$ echo $ !MON*
My_a my_b my_c

Obtenez une liste de variables correspondantes, puis parcourez chaque variable et imprimez sa valeur

$ My_a = 1
$ My_b = 2
$ My_c = 3
$ variables = $ !MON*
$ pour i en $ variables; faire écho $ i; écho "$ !i "; fait
My_a
1
My_b
2
My_c
3

Faire une chaîne toute majuscule

$ X = "Hello World"
$ echo $ x ^^
BONJOUR LE MONDE
Faire une ficelle toutes les minuscules
$ X = "Hello World"
$ echo $ x ,,
Bonjour le monde
Faire le premier caractère d'une chaîne en majuscule
$ X = "George Washington"
$ echo $ x ^
George Washington
Faire le premier caractère d'une corde en minuscules
$ X = bob
$ echo $ x,
bob

Paramètres de position

Les paramètres de position sont normalement considérés comme des paramètres de ligne de commande, comment les utiliser sont affichés avec des exemples ci-dessous.

Paramètre 0 $ est le nom de script qui est en cours d'exécution puis 1 $, 2 $, 3 $, etc. sont des paramètres de ligne de commande transmis à un script.

$ script Cat.shot
Echo 0 $
écho à 1 $
écho 2 $
écho 3 $
$ bash ./scénario.sharboule de banane aux pommes
./scénario.shot
pomme
banane
carotte

Le paramètre $ * est une variable unique avec tous les arguments de ligne de commande concaténés.

$ script Cat.shot
écho à 1 $
écho 2 $
echo $ *
$ bash ./scénario.sh Banana aux pommes
pomme
banane
banane de pommes

Le paramètre $ # est un nombre avec la quantité de paramètres de position passés à un script dans ce cas ci-dessous, il y a 2 arguments passés.

$ script Cat.shot
écho à 1 $
écho 2 $
echo $ *
Echo $ #
$ bash ./scénario.sh Banana aux pommes
pomme
banane
banane de pommes
2

Expansion de Tilde

L'expansion de Tilde est couramment observée avec les noms d'utilisateur et les répertoires de la maison, les exemples sont présentés ci-dessous.

Extension Tilde pour obtenir le répertoire domestique de l'utilisateur actuel, en utilisant juste Tilde sans le nom d'utilisateur.

$ echo $ utilisateur
racine
$ cd ~ /
$ pwd
/racine

Reportez-vous au répertoire domestique d'un utilisateur spécifique, pas à l'utilisateur actuel avec Tilde et le nom d'utilisateur

$ CD ~ Linuxhint
$ pwd
/ Home / Linuxhint

Substitution arithmétique

La substitution arithmétique permet à Bash de faire des opérations mathématiques dans le shell ou dans un script. Des exemples d'utilisations courantes sont présentées ci-dessous.

Substitution arithmétique simple par $ et double parenthèses

$ echo $ ((2 + 3))
5

L'opérateur de post incrément mettra à jour la valeur de une après la commande actuelle, note qu'il y a une décrémentation de post équivalente non affichée ici.

$ X = 2
$ echo $ ((x ++))
2
$ echo $ x
3

L'opérateur de pré-incrément mettra à jour la valeur par un juste avant la commande actuelle, notez qu'il existe un opérateur pré-décrément équivalent non affiché ici.

$ X = 2
$ echo $ ((++ x))
3
$ echo $ x
3

L'opérateur d'exposant peut augmenter un nombre à une puissance de façon exponentielle

$ echo $ ((5 ** 2))
25

Shift bitwise gauche; Dans ce cas, déplacez les bits du numéro décimal 8 vers la gauche qui le multiplie essentiellement par 2

$ echo $ ((8<<1))
16

Shift à droite sur le sens bit; Dans ce cas, déplacez les bits du numéro décimal 8 vers la droite qui divise essentiellement le nombre de 2

$ echo $ ((8 >> 1))
4

Bitwise et l'opérateur comparera les nombres un peu à bit et le résultat sera les bits qui sont tous définis.

$ echo $ ((4 & 5))
4

Bitwise ou l'opérateur comparera les nombres un peu à bit et les résultats seront les bits où l'une ou l'autre des entrées a le bit.

$ echo $ ((4 | 9))
13

L'opérateur d'égalité arithmétique testera la vérité et le retourra 1 ou 0

$ echo $ ((4 == 4))
1

L'opérateur d'inégalité arithmétique testera la non-égalité et le retourra 1 ou 0

$ echo $ ((4 != 4))
0

L'opérateur conditionnel testera le premier argument s'il est vrai, remplacez par le deuxième argument et si faux remplace par le troisième. Dans ce cas, 5 équivaut à 4 + 1, donc le premier conditionnel est vrai et 9 est renvoyé. 5 n'égale pas 4 + 2 donc dans le deuxième Echo 7 est renvoyé.

$ echo $ ((5 == 4 + 1 ? 9: 7))
9
$ echo $ ((5 == 4 + 2 ? 9: 7))
7

Vous pouvez utiliser des nombres hexadécimaux dans les extensions arithmétiques, dans ce cas, 0xa équivaut à 10 et 10 + 7 = 17.

$ echo $ ((0xa + 7))
17

Division des mots

En utilisant la variable d'environnement IFS pour enregistrer un délimiteur, et en utilisant les commandes Read and ReadArray, nous pouvons analyser les cordes dans un tableau de jetons, puis compter les jetons et opérer sur eux. Des exemples sont indiqués ci-dessous.
Utilisez le paramètre IFS en tant que délimiteur, lisez les jetons dans un tableau réparti par IFS qui est défini sur un caractère spatial, puis imprimez les jetons un par un

$ text = "Hello World"
$ Ifs = "
$ lecture -a jetons <<< "$text"
$ echo "Il y a des mots $ # tokens [*] dans le texte."

Il y a 2 mots dans le texte.

$ pour i dans "$ tokens [@]"; faire écho $ i; fait
Bonjour
Monde

User ReadArray sans IFS et spécifier Demiter dans la commande readArray. Remarque Ceci est juste un exemple où nous divisons un chemin de répertoire basé sur le délimiteur de barre oblique. Dans ce cas, le code a inclus la chaîne vide avant la première barre oblique qui devrait être ajustée dans une utilisation réelle, mais nous montrons simplement comment appeler ReadArray pour diviser une chaîne en jetons dans un tableau avec un délimiteur.

$ path = "/ home / linuxhint / usr / local / bin"
$ ReadArray -d / -T Tokens <<< "$path"
Echo "Il y a des mots $ # tokens [*] dans le texte."

Il y a 6 mots dans le texte.

$ pour i dans "$ tokens [@]"; faire écho $ i; fait
maison
linuxhint
usr
local
poubelle

Expansion du nom de fichier

Lorsque vous souhaitez faire référence à une liste de fichiers ou de répertoires du système de fichiers, une commande bash ou un script bash peut utiliser l'extension de nom de fichier pour générer une liste de fichiers et répertoires à partir de commandes simples. Des exemples sont indiqués ci-dessous.

Le caractère * s'étend à un joker et ramasse tous les fichiers correspondants avec le reste de la chaîne de joker. Ici, nous ramassons tous les fichiers se terminant .txt et passez-les dans la commande du du DU pour vérifier la taille du disque.

$ toucher un.txt b.txt c.SMS
$ echo "Hello World"> Contenu.SMS
$ du *.SMS
0 a.SMS
0 b.SMS
0 c.SMS
4 Contenu.SMS

Le ? Le personnage ne correspondra qu'un seul caractère et non un nombre infini de caractères, et donc dans cet exemple ne ramassera que des noms de fichiers avec un seul caractère suivi de .SMS.

$ toucher un.txt b.txt c.SMS
$ echo "Hello World"> Contenu.SMS
$ du ?.SMS
0 a.SMS
0 b.SMS
0 c.SMS

Les personnages entre parenthèses se développent pour correspondre à l'un des personnages. Dans cet exemple A.txt et c.txt sont ramassés par l'expansion

$ toucher un.txt b.txt c.SMS
$ echo "Hello World"> Contenu.SMS
$ du [ac].SMS
0 a.SMS
0 c.SMS

Les caractères entre parenthèses peuvent être une gamme de caractères et nous voyons ici tous les fichiers de A à la gamme C suivi de .Le suffixe txt est ramassé

$ toucher un.txt b.txt c.SMS
$ echo "Hello World"> Contenu.SMS
$ du [a-c].SMS
0 a.SMS
0 b.SMS
0 c.SMS

Conclusion

Nous avons couvert de nombreux types d'extensions de coquille dans cet article, et j'espère que les exemples simples pourront servir de livre de cuisine pour ce qui est possible à Bash pour vous rendre plus productif avec les extensions de la coquille. En tant que références supplémentaires, je recommande de lire le manuel complet de Bash, ainsi que les nombreux bons articles sur le site Web de Nixcraft sur les scripts bash, y compris les extensions de coquille. Nous avons d'autres articles qui pourraient vous intéresser à Linuxhint, notamment: 30 exemples de script bash, Bash minuscase cordes majuscules, correspondance de motifs bash et exemples de chaîne de division bash. Nous avons également un parcours gratuit de 3 heures gratuitement sur la programmation bash que vous pouvez trouver sur YouTube.