LINUX FU: BASH CORDES

Si vous êtes un programmeur standard, en utilisant bash pour les scripts peut sembler parfois limite, mais pour des tâches spécifiques, bash peut être extrêmement productive. Il se trouve, quelques-unes des limites de bash sont vraiment limites des coquilles plus anciennes, ainsi que le code des personnes que, pour être compatibles. D’autres problèmes sont perçus depuis quelques-unes des fonctions avancées en bash sont Arcane ou confusion.

Les chaînes sont un excellent exemple. Vous ne croyez pas de bash comme langage de manipulation de chaîne, mais il a beaucoup de méthodes puissantes pour gérer des chaînes. En fait, il peut avoir aussi bien beaucoup de façons, étant donné que la performance serpente dans beaucoup plus d’un endroit. Bien sûr, vous pouvez également appel téléphonique vers des programmes, ainsi que souvent il est juste beaucoup plus facile de faire un contact nous à un awk ou d’un script Python pour faire le levage de charges lourdes.

Mais collons avec bash-ismes pour la gestion des chaînes. De toute évidence, vous pouvez mettre une chaîne dans une variable d’ambiance, ainsi que retirez l’outil. Je vais vous présumer comprendre exactement comment l’interpolation de chaîne ainsi que des œuvres de citation de prix. En d’autres termes, cela doit avoir un sens:

1
echo « Votre chemin est $ PATH, ainsi que le répertoire actuel est $ {} PWD »

Long ainsi que le court

Supposons que vous voulez comprendre la longueur d’une chaîne. C’est une opération de chaîne tout à fait fondamental. En bash, vous pouvez composer $ {# var} pour découvrir la longueur de $ var:

1
2
3
4
5
6
7
8
9
# / Bin / bash
echo -n “Nom du projet?”
lecture PNAME
if (($ {#} PNAME> 16))
ensuite
echo Erreur: nom du travail plus de 16 caractères
autre
echo est $ {} de PNAME!
Fi

Le « (( » développe un contexte arithmétique qui est la raison pour laquelle vous pouvez vous en sortir avec une plus-unquoted que l’indication ici Si vous ne me dérange pas utiliser expr -. Qui est un programme à l’extérieur – il y a au moins deux méthodes beaucoup plus à y arriver:

1
2
3
echo $ {#} STR
expr longueur “$ {STR}”
expr match “$ {} STR”. *

Bien sûr, si vous vous permettent d’appeler en dehors de bash, vous pouvez utilisez awk ou toute autre chose à faire, aussi, mais nous nous en tiendrons avec expr comme il est assez léger.

Couteau suisse

En fait, expr peut faire beaucoup de manipulations de chaîne en plus de longueur ainsi que correspondre. Vous pouvez tirer une chaîne d’une chaîne en utilisant substr. Il est souvent utile d’utiliser l’index pour découvrir un caractère spécifique dans la première chaîne. Le programme utilise expr 1 comme premier caractère de la chaîne. Ainsi, par exemple:

1
2
3
4
5
6
7
8
9
dix
11
12
13
14
15
16
# / Bin / bash
echo -n “Chemin complet?”
lecture FFN
LAST_SLASH = 0
SLASH = $ (indice expr “FFN $” /) # découvrir la première barre oblique
while ((SLASH $! = 0))
fais
laisser LAST_SLASH = $ LAST_SLASH + $ SLASH # point suivant slash
SLASH = $ (indice expr “$ {FFN: LAST_SLASH $}” /) # look pour une autre
terminé
# Maintenant des points LAST_SLASH à la dernière barre oblique
echo -n “Répertoire:”
expr substr “$ FFN” $ 1 LAST_SLASH
echo -ou-
echo $ {FFN: 0: LAST_SLASH $}
# Oui, je comprends dirname mais ceci est un exemple

Entrez un chemin complet (comme / foo / bar / hackaday) ainsi que le script va découvrir la dernière barre oblique imprimer ainsi que le nom, autant que ainsi que notamment la dernière barre en utilisant deux méthodes différentes. Ce script utilisent expr mais utilise également la syntaxe pour bash est développé dans l’extraction sous-chaîne qui commence à l’indice zéro. Par exemple, si la FOO variable consiste de « Hackaday »:

$ {FOO} -> Hackaday

$ {FOO: 1} -> ackaday

$ {FOO: 5: 3} -> jour

Le nombre premier est un équilibre hors ainsi que la seconde est une longueur si elle est positive. Vous pouvez également faire soit du négatif des chiffres, même si vous besoin d’une zone après les deux points si le solde est négatif et. Le dernier caractère de la chaîne est à l’index -1, par exemple. Une longueur défavorable est un raccourci pour un réglage absolu à partir de la fin de la chaîne. Alors:

$ {FOO: -3} -> jour

$ {FOO: 1: -4} -> ack

$ {FOO: -8: -4} -> Hack

Bien sûr, l’un ou les deux chiffres peuvent être des variables, comme vous pouvez le voir dans l’exemple.

Moins est plus

Parfois, vous ne voulez pas découvrir quelque chose, vous voulez juste pour se débarrasser de celui-ci. bash a des offres de méthodes pour éliminer les sous-chaînes en utilisant des chaînes fixes ou correspondance de motif à base glob. Il y a quatre variations. Une paire de suppressions d’éliminer la plus longue, ainsi que les plus courtes possibles de la sous-chaînes avant de la chaîne ainsi que l’autre paire fait exactement la même chose à l’arrière de la chaîne. Penses-y:

1
2
3
4
5
TSTR = my.first.file.txt
echo $ {TSTR%. *} # impressions my.first.file
echo $ {TSTR %%. *} # imprime mon
echo $ {TSTR # * fi} # impressions rst.file.txt
echo $ TSTR ## * fi} # impressions le.txt

Transformation

Bien sûr, souvent, vous ne voulez pas supprimer, autant que vous voulez remplacer une chaîne par une chaîne plus. Vous pouvez utiliser une barre oblique pour remplacer la première instance d’une chaîne de navigation ou deux barres obliques pour remplacer globalement. Vous pouvez également arrêter de travailler pour fournir une chaîne de remplacement ainsi que vous aurez une autre méthode pour les pièces de suppression de chaînes. Une autre technique consiste à ajouter un # ou% à l’ancre le match au début ou à la fin de la chaîne,juste comme avec une suppression.

1
2
3
4
5
Tstr = my.first.file.txt
echo $ {tstr / fi / fi} # my.first.file.txt
echo $ {tstr // fi / fi} # my.first.file.txt
echo $ {tstr /#*./ préfixe-} # préfixe-txt (note: toujours la plus longue correspondance)
echo $ {tstr /%.*/. Sauvegarde} # My.backup (Remarque: Toujours le plus long correspondoir)

Divers

Certaines des méthodes beaucoup plus typiques pour manipuler des chaînes dans Bash doivent faire avec prise en charge des paramètres. signifie que vous avez un script qui attend qu’une variable appelée OTERM puisse être définie, mais vous voulez être sûr:

1
Realterm = $ {OTERM: -VT100}

Maintenant, Realterm aura la valeur d’OTERM ou de la chaîne “VT100” s’il n’y avait rien dans OTERM. Souvent, vous souhaitez définir OTERMO-SO, alors que vous pourriez désigner sur OTERM au lieu de Realterm, il existe un moyen beaucoup plus facile. Utilisez: = au lieu de la suivante: – Séquence. Si vous faites cela, vous n’exigeez pas nécessairement une tâche du tout, bien que vous puissiez utiliser un si vous le souhaitez:

1
echo $ {oterm: = vt100} # maintenant tanm est vt100 s’il était vide avant

Vous pouvez également inverser le sens de vous assurer que vous ne remplacez que la valeur uniquement si la valeur principale n’est pas vide, bien que cela ne soit pas aussi utile:

1
echo $ {débogage: + “Le mode de débogage est sur”} # inverse -; Pas d’affectation

Beaucoup plus drastine Détermine vous permet d’imprimer un message d’erreur à StDerr ainsi que d’abandonner une coque non interactive:

1
Realterm = $ {OTERM:? “Erreur. Veuillez définir OTERM avant d’appeler ce script”}

Au cas où

La conversion des choses à la situation supérieure ou inférieure est relativement simple. Vous pouvez fournir un motif global qui correspond à un seul caractère. Si vous l’omettez, c’est exactement le même que?, Qui correspond à tout type de caractère. Vous pouvez choisir de modifier tous les caractères correspondants ou essayez simplement de correspondre au tout premier personnage. Juste voici les exemples obligatoires:

1
2
3
4
5
6
7
8
9
Nom = “Joe Hackaday”

echo $ {nom ^} # imprime joe hackaday (première correspondance de tout type de caractère)
echo $ {nom ^^} # imprime joe hackaday (tout type de caractère)
echo $ {nom ^^ [a]} # imprime joe hackaday (tous les personnages)
echo $ {nom ,,] # imprime joe hackaday (tous les personnages)
echo $ {nom,] # imprime Joe Hackaday (premier caractère correspondant ainsi que ne convertit pas)
Nom = “Joe Hackaday”
echo $ {nom ,, [a-h]} # imprime joe hackaday (appliquer le modèle à tous les caractères ainsi que convertir A-H en minuscule)

Les versions récentes de bash peuvent également convertir la situation supérieure ainsi que la situation inférieure utilisant $ {var @ u} ainsi que $ {var @ L}, ainsi que le tout premier caractère utilisant @L ainsi que votre kilométrage peut varier .

Passer le test

Vous reconnaissez probablement que lorsque vous effectuez un test de base, ce téléphone appelle vraiment un programme:

1
2
Si [$ f -eq 0]
ensuite …

Si vous faites un LS ON / USR / BIN, vous verrez un exécutable vraiment nommé «[» utilisé comme abrégé pour le programme de test. Cependant, Bash a son propre test sur le type de deux crochets:

1
2
Si [$ f == 0]]]
ensuite …

Ce test intégré peut gérer les expressions de routine utilisant = ~ c’est donc un choix supplémentaire pour les chaînes assorties:

1
Si [[“NOM $” = ~ [HH] A.K]] …

Choisis sagement

Bien sûr, si vous faites une époque de traitement de texte, vous n’avez peut-être pas l’obligation d’utiliser Bash. Même si vous êtes, ne manquez pas de vous rappeler que vous pouvez toujours tirer parti d’autres programmes tels que TR, AWK, SED, ainsi que beaucoup d’autres pour faire des choses comme celle-ci. Bien sûr, la performance ne sera pas aussi grande – Toutefois, si vous êtes impatient de la performance, pourquoi pouvez-vous composer un script?

À moins que vous ne veurez pas de script de script, il est formidable d’avoir quelques-unes de ces techniques dans votre poche arrière. les utiliser judicieusement.