Variables de bash spéciaux avec des exemples

Variables de bash spéciaux avec des exemples

Bash est un excellent langage de codage, qui vous permet de faire des choses complexes comme la manipulation des mégadonnées, ou simplement de créer des scripts de gestion de service ou de bureau.

La compétence de niveau d'entrée requise pour utiliser le langage bash est assez faible, et les scripts à une ligne (un jargon souvent utilisé, qui indique plusieurs commandes exécutées sur la ligne de commande, formant un mini-script), ainsi que des scripts réguliers, peuvent croître en complexité (et à quel point ils sont écrits) lorsque le développeur bash apprend plus.

Apprendre à utiliser des variables spéciales dans Bash est une partie de cette courbe d'apprentissage. Tandis qu'à l'origine, les variables spéciales peuvent sembler cryptiques: $$, $?, $ *, \ 0 0, 1 $, etc., Une fois que vous les comprenez et les utilisez dans vos propres scripts, les choses deviendront bientôt plus claires et plus faciles à retenir.

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser des variables spéciales dans Bash
  • Comment citer correctement les variables, même spéciales
  • Exemples utilisant des variables spéciales de la ligne de commande et des scripts

Variables de bash spéciaux avec des exemples

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 Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre Toute utilité qui n'est pas incluse dans le shell bash par défaut peut être installée en utilisant Sudo Apt-Get Install Utility-Name (ou Installation de miam pour les systèmes basés sur Redhat)
Conventions # - nécessite 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 régulier non privilégié
  1. $$ - Afficher le PID (identifiant de processus)

    Dans cet exemple, nous utilisons la variable spéciale $$ Pour afficher le PID (identifiant de processus) pour notre programme actuel. Cela fonctionne un peu différemment selon que vous utilisez cette variable à partir de la ligne de commande:

    $ echo $$ 316204 $ ps -ef | grep -e "$$ | pid" uid pid ppid c stime tty time cmd roel 316204 62582 0 11:53 pts / 2 00:00:00 Bash Roel 316499 316204 0 11:57 PTS / 2 00:00:00 PS - EF Roel 316500 316204 0 11:57 PTS / 2 00:00:00 Grep -E 316204 | PID 

    Ou à l'intérieur d'un script. Par exemple, considérons le script suivant test.shot:

    Echo $$ ps -ef | grep -e "$$ | pid" 
    Copie

    Qui, lorsque nous le faisons exécutable (Test Chmod + X.shot) et exécuter, produit:

    $ chmod + x test.sh $ ./test.SH 316820 UID PID PPID C STIME TTY TIME CMD ROEL 316820 316204 0 12:01 PTS / 2 00:00:00 BASH ROEL 316821 316820 0 12:01 PTS / 2 00:00:00 PS -EF ROEL 316822 316820 0: 01 pts / 2 00:00:00 grep -e 316820 | PID 

    La différence est dans le Piquer produit! Cela peut à première vue avoir un sens conceptuel, mais expliquons la principale raison pour laquelle Piquer Diffère: nous utilisons une coquille de bash différente. La première commande exécutée était directement sur la ligne de commande, et donc notre spécial $$ variable (qui identifie le PID du programme en cours d'exécution) produit le Piquer de la coquille de bash en cours d'exécution (être 316204).

    Dans la deuxième instance, nous exécutons un script et chaque début d'un script démarrera toujours un nouveau shell bash. Le résultat est que notre Piquer est le Piquer du Bash Shell nouvellement démarré (316820). Nous pouvons également confirmer cela en regardant le PPID (je.e. Parent Pid, ou le parent de l'identifiant de processus) - c'est 316204 qui correspond à notre coquille de bash à partir duquel nous avons commencé le script, comme on le voit dans le premier exemple (le premier et le deuxième exemple ont été exécutés dans le même terminal sur la même machine).

    Le grep -e La commande dans nos deux exemples nous permet de capturer la première ligne de la liste complète des processus de la machine (comme obtenu par ps -ef) en autorisant un support regex prolongé et greminage pour Piquer Outre notre Piquer (en utilisant $$). Le | est le séparateur d'expression régulière étendu qui permet cette double capture.

    Pour plus d'informations sur les expressions régulières, veuillez consulter nos articles regexps pour les débutants avec des exemples et un bash avancé avec des exemples d'articles.

    Notez également que nous avons automatisé la capture PID en utilisant $$ dans le grep commande. Ce $$ La variable ne change jamais à moins qu'une nouvelle coquille / sous-shell bash ne soit démarrée, comme nous pouvons le voir dans l'exemple suivant:

    $ echo $$ 316204 $ bash $ echo $$ 318023 $ echo $ ppid 316204 

    Le Piquer de notre coquille de bash principale est toujours 316204 comme avant. Ensuite, nous commençons une nouvelle sous-coquille et le Piquer de cette nouvelle coquille est 318023 Lorsqu'il est inspecté. Et, en utilisant la variable automatiquement (par bash) $ Ppid Nous pouvons confirmer le PPID (ID de processus parent) de la coquille / sous-coquille secondaire 316204, qui correspond à notre coque principale. Comme vous pouvez le voir, en termes de gestion des processus et en particulier le $$ variable, il n'y a pas beaucoup de différence entre le démarrage d'un script et une nouvelle sous-coquille.

    Pour plus d'informations sur la gestion des processus BASH, vous aimerez peut-être vérifier notre gestion de la gestion des processus de fond et la gestion des processus de processus et les articles automatiques de terminaison des processus.



  2. $? - code de sortie

    Le $? La variable nous dit ce que le code de sortie était de la commande précédente. Connaître le code de sortie d'une instruction exécutée nous permet de continuer un script dans deux ou plusieurs directions différentes. Par exemple, si nous avons commencé un RM commande (pour supprimer certains fichiers) à partir d'un programme, nous pouvons vouloir vérifier si le processus s'est terminé avec succès.

    Si la code de sortie est 0, Il (lire: presque toujours) signifie qu'un processus s'est terminé avec succès. Si cependant le code de sortie est 1 (ou plus) Il est souvent (mais pas toujours) que le processus s'est terminé avec une erreur ou un résultat négatif, par exemple, le fichier n'a pas pu être supprimé dans notre exemple. Voyons comment cela fonctionne sur la ligne de commande, en nous rappelant que le fonctionnement de cette variable à partir d'un script est identique.

    $ toucher ceci.existe $ RM.existe $ echo $? 0 $ rm ceci.fait.pas.exister rm: ne peut pas supprimer ceci.fait.pas.exister ': aucun fichier ou répertoire de ce type $ echo $? 1 

    Nous créons d'abord un fichier ce.existant en utilisant le touche commande. touche crée simplement un fichier de taille zéro sans rien y écrire. Ensuite, nous supprimons le fichier en utilisant RM ceci.existant et afficher le $? Code de sortie en utilisant écho. Le résultat est 0 car la commande a réussi comme prévu et vu par aucune erreur n'est renvoyée.

    Ensuite, nous essayons de supprimer un fichier qui n'existe pas et de recevoir une erreur. Lorsque nous vérifions le code de sortie, c'est en effet 1 indiquant qu'une erreur s'est produite. Nous pouvons vérifier facilement la valeur de cette variable à partir de la ligne de commande ou à partir d'un script en utilisant un Si [$? -Eq 0]; alors ou une déclaration conditionnelle similaire (terminée par Fi).

    En apprendre davantage sur si instructions basées, veuillez consulter les déclarations de bash si elif else puis fi. Combinaison $? avec si Les déclarations sont communes et puissantes pour automatiser diverses choses en bash.

  3. 1 $, 2 $,… $ * - Arguments de passage

    Lorsque nous commençons un script sur la ligne de commande bash, nous pouvons transmettre des arguments à la même. Il appartient entièrement au script pour gérer les arguments qui lui sont transmis. Si le script par exemple ne peut pas gérer du tout des arguments (la valeur par défaut), il n'y a aucune conséquence à spécifier ou à ne spécifier aucune, ou beaucoup, des variables à un script.

    Nous pouvons gérer les arguments passés en utilisant les variables spéciales 1 $, 2 $, $ * etc. Le premier argument transmis au script sera toujours 1 $, Le deuxième argument sera toujours 2 $ etc. Une chose à surveiller est que si vous introduisez un espace dans un client de bash configuré par défaut, alors Bash interprétera cet espace comme un séparateur.

    Si vous essayez de passer du texte comme par exemple Ceci est un exemple Vous devrez le citer correctement comme ceci: "Ceci est un exemple"; Pour que Bash puisse voir ce texte comme une seule variable passée.



    Le spécial $ * La variable est un raccourci pour l'écriture Toutes les variables en une seule chaîne. Voyons comment cela fonctionne en définissant un nouveau test2.shot script comme suit:

    echo "1: $ 1" echo "2: $ 2" echo "all: $ *" 
    Copie

    Comme légère variation, nous avons choisi de définir nos variables ici comme $ 1 pour $ * au lieu de 1 $ pour $ *. En fait, ce serait une bonne idée de toujours citer les variables de cette façon. Pour plus d'informations, veuillez consulter notre analyse variable correcte et citant dans Bash Article.

    Lorsque nous exécutons la même chose, en utilisant deux ou trois arguments, nous voyons:

    $ chmod + x test2.sh $ ./ test2.sh '1 "2' 1: 1 2: 2 Tous: 1 2 $ ./ test2.sh '1 "2" 3' 1: 1 2: 2 Tous: 1 2 3 

    Nous pouvons voir comment notre première entrée au script est correctement reconnue comme 1 $ etc. De plus, nous remarquons que le troisième argument est complètement ignoré par le script jusqu'à atteindre le echo "all: $ *" instruction qui montre en effet tous les arguments comme discuté précédemment. Explorons maintenant une entrée incorrecte sans citer:

    $ ./ test2.sh C'est censé être une seule phrase. 1: Ce 2: est tout: c'est censé être une phrase unique. $ ./ test2.sh "C'est censé être une seule phrase."1: c'est censé être une seule phrase. 2: Tout: c'est censé être une seule phrase. 

    Ici, il devient clair comment un espace peut être interprété comme un séparateur au lieu d'un espace réel, à moins que le texte ne soit correctement cité. Dans le premier résultat, Ce est considéré comme le premier argument, alors que dans le deuxième résultat, la phrase entière est considérée comme le premier argument.



  4. 0 $ - la commande en cours d'exécution

    Avoir appris 1 $, on pouvait se demander ce que le \ 0 0 La variable spéciale fait. Si vous pensez à la façon dont une commande est formée (Command Argument1 Argument2 etc.), vous pouvez remarquer comment commande vient avant le premier argument (1 $). La commande, d'une certaine manière, est donc - visuellement - \ 0 0, Et c'est exactement ce que le spécial \ 0 0 la variable contient; la commande exécutée.

    $ echo \ 0 $ bash 

    Comme nous pouvons le voir, et comme c'est logique, sur la ligne de commande, la commande en cours d'exécution est frapper. Si nous ajoutons le Echo \ 0 0 commande à un script de test test3.shot et exécuter la même chose, nous obtenons:

    $ ./ test3.shot ./ test3.SH $… / Workspace / Test3.sh… / workspace / test3.shot 

    Comme maintenant la commande en cours d'exécution est ./ test3.shot, exactement comme exécuté à partir de la ligne de commande. Si nous commençons la commande en utilisant un nom de chemin plus long comme … / Espace de travail / test3.shot Là encore, cela est répété via le spécial \ 0 0 variable.

Conclusion

Dans cet article, nous avons exploré le $$, $?, 1 $, 2 $, etc., $ * et \ 0 0 Variables, comment elles fonctionnent et comment vous pouvez les utiliser directement à partir de la ligne de commande ou à partir de scripts. Il existe quelques autres variables spéciales, mais ce sont les principales variables spéciales de Bash que j'ai utilisées pendant de nombreuses années de codage bash. Apprécier!

Tutoriels Linux connexes:

  • Récupération des pages Web à l'aide de WGet, Curl et Lynx
  • Manipulation de Big Data pour le plaisir et le profit Partie 1
  • Manipulation des mégadonnées pour le plaisir et le profit Partie 3
  • Exemples de liner complexe Linux Bash
  • Manipulation de Big Data pour le plaisir et le profit Partie 2
  • Boucles imbriquées dans les scripts bash
  • Masterring Bash Script Loops
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Boucles de bash avec des exemples