Description

bash est le shell par défaut sur les stations Unix/Linux. Il s'agit d'une extension au shell de base sh afin de le rendre plus performant et plus facile à utiliser.

Scripts bash en quelques mots

On peut déjà écrire des scripts assez puissants en bash avec juste quelques notions de bases:

  • Les variables:
    • Assignation d'une valeur à une variable: VAR=valeur
    • Utilisation de la valeur de la variable: $VAR. De plus, on peut effectuer toute une série de traitement sur la valeur de la variable. Par exemple, pour retirer la chaîne foo à la fin de la variable, VAR=${VAR%foo} (pour plus de détails, voir la section Parameter expansion du man de bash).
  • La redirection des entrées et sorties:
    • Redirection de la sortie d'un programme vers un fichier: programme > fichier
    • Donner un fichier comme entrée à un programme: programme < fichier
    • Donner comme entrée d'un programme la sortie d'un autre programme: programme1 | programme2
    • Mettre la sortie d'un programme dans une variable: VAR=`programme`
  • Les structures de contrôles de base:
    • Les conditions : if [ condition ]; then commandes; else commandes; fi
    • La boucle sur des valeurs: for ((VAR=1; VAR<10; VAR++)); do commandes_qui_utilisent_$VAR; done
    • L'itération sur une liste: for VAR in liste; do commandes_qui_utilisent_$VAR; done. La liste peut être une suite d'éléments séparés par des espaces element1 element2 element3 mais aussi utiliser des jokers *.c

Il suffit maintenant de combiner tout cela en utilisant aussi les commandes incluses directement dans bash (tapez help dans bash), ainsi que tous les programmes de base à votre disposition (grep, sort, head, etc.: voir man nom_de_la_commande).

Un petit exemple pour illustrer le principe:

  for NAME in *.c; do
    if (tail -n 10 < $NAME | grep wiki); then
      mv $NAME ${NAME%.c}.wiki
    fi
  done

Ce tout petit script va renommer tous les fichiers se terminant par .c et contenant la chaîne wiki dans les 10 dernières lignes en un fichier portant le même nom mais avec l'extension .wiki.

Notes des séminaires INGI

Introducing Bash with Ding

Linux, commandes "de base"

Linux, commandes "avancées"

Inroduction aux outils Unix

Exercice : script userinfo.sh

L'objectif de cet exercice est de construire de façon incrémentale un petit script donnant des informations sur un utilisateur du système.

Les spécifications (loosy :-)) sont les suivantes :

  • Prendre un argument, le login dont on veut connaître les informations
  • Enregistrer dans un fichier des informations à chaque utilisation du script. Ces infos doivent comprendre :
    • Date et heure d'utilisation
    • Login de l'utilisateur lancant le script
    • Path utilisé
    • uid et gid effectif utilisés
    • Argument(s) envoyé(s)
  • Afficher son debug sur l'erreur standard
  • Récupérer les informations demandée grace à la commande ypcat passwd, dont on raffine l'output avec grep
  • Mettre en forme les information pour les présenter quelque peu

Les «corrigés» des differentes étapes vue pendant le séminaire :

  • Version 1 : premier script, redirection dans un fichier, logger l'activité
  • Version 2: récupérer les arguments, pipe, ypcat passwd
  • Version 3 : instruction if, vérifer les arguments, code de retour, substitution
  • Version 4 : instruction for, utilisation de la variable IFS pour présenter les informations

Trucs et astuces

Lorsqu'il est utilisé en ligne de commande, <code>bash</code> contient plusieurs facilités pour simplifier la vie de son utilisateur :

  • bash conserve un historique des dernières commandes tapées. Les flèches haut et bas permettent de récupérer les commandes précédentes. L'historique des commandes est stockée dans le fichier ~/.bash_history
  • Pour récupérer facilement une commande bien précise, tapez CTRL-R pour passer en mode de recherche interactive. L'invite de commande change et si vous tapez des lettres, bash vous présente la dernière commande commençant par les lettres entrées. Vous pouvez alors parcourir les différents matching dans l'historique et refaisant CTRL-R. Dans ce mode de fonctionnement,
    • ENTER exécute la commande acutellement sur la ligne (même incomplète) et sort du mode de recherche;
    • TAB ou ESC recopie dans le shell la commande acutellement sur la ligne, pour pouvoir l'éditer, et sort du mode de recherche;
    • CTRL-C quitte le mode de recherche
  • Lorsque l'utilisateur tape sur la touche tabulation, bash suggère la fin de la commande ou du nom de fichier
  • Les flèches, la touche home et la touche end permettent de se ballader dans la ligne de commande courante. Lorsque home et end ne fonctionnent pas, lorsque vous avez des problèmes de compatibilité de clavier à distance ou que le terminal ne le supporte pas, vous pouvez utiliser les vieux arccourcis : CTRL-A pour home et CTRL-E pour end.
  • Vous pouvez lancer un programme en tâche de fond (background) en le faisant suivre du caractère &. Par exemple, xterm & vous permettra de lancer une fenêtre de terminal supplémentaire.
  • Vous pouvez interrompre un programme en tapant sur CTRL-C. Si cela ne fonctionne pas, utilisez ps pour déterminer le numéro du processus et ensuire kill pour le supprimer
  • Vous pouvez suspendre un processus en tapant sur CTRL-Z. Un processus suspendu ne progresse plus. Vous pouvez le mettre en tâche de fond avec la commande bg ou le remettre comme tâche principale avec fg

Informations complémentaires