Premiers pas avec Bash

Bonjour le monde

Coque interactive

Le shell Bash est couramment utilisé de manière interactive : Il vous permet d’entrer et de modifier des commandes, puis de les exécuter lorsque vous appuyez sur la touche Retour. De nombreux systèmes d’exploitation basés sur Unix et de type Unix utilisent Bash comme shell par défaut (notamment Linux et macOS). Le terminal entre automatiquement dans un processus shell Bash interactif au démarrage.

Affichez “Hello World” en saisissant ce qui suit :

echo "Hello World"
#> Hello World  # Output Example

Remarques

  • Vous pouvez changer le shell en tapant simplement le nom du shell dans le terminal. Par exemple : sh, bash, etc.

  • [echo][2] est une commande intégrée de Bash qui écrit les arguments qu’elle reçoit sur la sortie standard. Il ajoute une nouvelle ligne à la sortie, par défaut.


Shell non interactif

Le shell Bash peut également être exécuté de manière non interactive à partir d’un script, ce qui fait que le shell ne nécessite aucune interaction humaine. Le comportement interactif et le comportement scénarisé doivent être identiques – une considération de conception importante du shell Unix V7 Bourne et transitivement Bash. Par conséquent, tout ce qui peut être fait en ligne de commande peut être placé dans un fichier de script pour être réutilisé.

Suivez ces étapes pour créer un script “Hello World” :

  1. Créez un nouveau fichier appelé hello-world.sh

    touch hello-world.sh
    
  2. Rendez le script exécutable en exécutant [chmod][3] +x hello-world.sh

  3. Ajoutez ce code :

    #!/bin/bash
    echo "Hello World"
    

Ligne 1 : la première ligne du script doit commencer par la séquence de caractères “# !”, appelée shebang1. Le shebang demande au système d’exploitation d’exécuter /bin/bash, le shell Bash, en lui passant le chemin du script comme argument.

E.g. `/bin/bash hello-world.sh`

Ligne 2 : utilise la commande [echo][2] pour écrire Hello World sur la sortie standard.

  1. Exécutez le script hello-world.sh à partir de la ligne de commande en utilisant l’une des options suivantes :
  • ./hello-world.sh – le plus couramment utilisé et recommandé
  • /bin/bash hello-world.sh
  • bash hello-world.sh – en supposant que /bin est dans votre $PATH
  • sh hello-world.sh

Pour une utilisation réelle en production, vous devez omettre l’extension .sh (qui est de toute façon trompeuse, car il s’agit d’un script Bash, pas un script sh) et peut-être déplacer le fichier dans un répertoire de votre PATH afin qu’il soit disponible quel que soit votre répertoire de travail actuel, tout comme une commande système telle que cat ou ls.

Les erreurs courantes incluent :

  1. Oublier d’appliquer l’autorisation d’exécution sur le fichier, c’est-à-dire chmod +x hello-world.sh, ce qui entraîne la sortie de ./hello-world.sh : autorisation refusée.

  2. Modification du script sous Windows, qui produit des caractères de fin de ligne incorrects que Bash ne peut pas gérer.

    A common symptom is : command not found where the carriage return has forced the cursor to the beginning of line, overwriting the text before the colon in the error message.

    The script can be fixed using the dos2unix program.

    An example use: dos2unix hello-world.sh

    dos2unix edits the file inline.

  3. Utiliser sh ./hello-world.sh, sans se rendre compte que bash et sh sont des shells distincts avec des fonctionnalités distinctes (bien que Bash soit rétrocompatible, l’erreur inverse est inoffensive).

    Anyway, simply relying on the script’s shebang line is vastly preferable to explicitly writing bash or sh (or python or perl or awk or ruby or…) before each script’s file name.

    A common shebang line to use in order to make your script more portable is to use #!/usr/bin/env bash instead of hard-coding a path to Bash. That way, /usr/bin/env has to exist, but beyond that point, bash just needs to be on your PATH. On many systems, /bin/bash doesn’t exist, and you should use /usr/local/bin/bash or some other absolute path; this change avoids having to figure out the details of that.


1 Aussi appelé sha-bang, hashbang, pound-bang, hash-pling.

[1] : https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop [2] : https://www.gnu.org/software/bash/manual/bash.html#index-echo [3] : http://ss64.com/bash/chmod.html

Bonjour tout le monde à l’aide de variables

Créez un nouveau fichier appelé hello.sh avec le contenu suivant et donnez-lui des autorisations exécutables avec chmod +x hello.sh.

Exécuter/Exécuter via : ./hello.sh

#!/usr/bin/env bash

# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"

# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World

Cela affichera Hello, World sur la sortie standard lors de l’exécution.

Pour indiquer à bash où se trouve le script, vous devez être très précis, en le pointant vers le répertoire contenant, normalement avec ./ s’il s’agit de votre répertoire de travail, où . est un alias vers le répertoire courant. Si vous ne spécifiez pas le répertoire, bash essaie de localiser le script dans l’un des répertoires contenus dans la variable d’environnement $PATH.


Le code suivant accepte un argument $1, qui est le premier argument de la ligne de commande, et le renvoie dans une chaîne formatée, après Hello, .

Exécuter/Exécuter via : ./hello.sh World

#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World

Il est important de noter que $1 doit être placé entre guillemets doubles et non entre guillemets simples. "$1" se développe au premier argument de la ligne de commande, comme vous le souhaitez, tandis que '$1' évalue la chaîne littérale $1.

Note de sécurité : Lisez Implications pour la sécurité de l’oubli de citer une variable dans les shells bash pour comprendre l’importance de placer le texte de la variable entre guillemets doubles.

Hello World avec entrée utilisateur

Ce qui suit invitera un utilisateur à entrer, puis stockera cette entrée sous forme de chaîne (texte) dans une variable. La variable est ensuite utilisée pour envoyer un message à l’utilisateur.

#!/usr/bin/env bash
echo  "Who are you?"
read name
echo "Hello, $name."

La commande read ici lit une ligne de données de l’entrée standard dans la variable name. Celui-ci est ensuite référencé à l’aide de $name et affiché sur la sortie standard à l’aide de echo.

Exemple de sortie :

$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.

Ici, l’utilisateur a saisi le nom “Matt”, et ce code a été utilisé pour dire “Bonjour, Matt”.

Et si vous souhaitez ajouter quelque chose à la valeur de la variable lors de son impression, utilisez des accolades autour du nom de la variable, comme indiqué dans l’exemple suivant :

#!/usr/bin/env bash
echo  "What are you doing?"
read action
echo "You are ${action}ing."

Exemple de sortie :

$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.

Ici, lorsque l’utilisateur entre une action, “ing” est ajouté à cette action lors de l’impression.

Importance des guillemets dans les chaînes

Les guillemets sont importants pour l’expansion des chaînes dans bash. Avec ceux-ci, vous pouvez contrôler la façon dont le bash analyse et développe vos chaînes.

Il existe deux types de citation :

  • Faible : utilise des guillemets doubles : “
  • Fort : utilise des guillemets simples : ‘

Si vous voulez frapper pour développer votre argument, vous pouvez utiliser Weak Quoting :

#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World

Si vous ne voulez pas écraser pour développer votre argument, vous pouvez utiliser Strong Quoting :

#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world

Vous pouvez également utiliser escape pour empêcher l’expansion :

#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world

Pour des informations plus détaillées autres que les détails pour débutants, vous pouvez continuer à le lire ici.

Affichage des informations pour les fonctions intégrées de Bash

help <command>

Cela affichera la page d’aide (manuelle) de Bash pour l’intégré spécifié.

Par exemple, “help unset” affichera :

unset : unset [-f] [-v] [-n] [nom …] Valeurs et attributs non définis des variables et fonctions shell.

Pour chaque NOM, supprimez la variable ou la fonction correspondante.

Options : -f traite chaque NOM comme une fonction shell -v traite chaque NOM comme une variable shell -n traite chaque NOM comme une référence de nom et supprime la variable elle-même plutôt que la variable à laquelle il fait référence

Sans options, unset essaie d’abord de désactiver une variable, et si cela échoue, essaie de désactiver une fonction.

Certaines variables ne peuvent pas être désactivées ; voir aussi `lecture seule’.

Statut de sortie : Renvoie le succès à moins qu’une option non valide soit donnée ou qu’un NOM soit en lecture seule.

Pour voir une liste de tous les éléments intégrés avec une courte description, utilisez

help -d

Hello World en mode “Débogage”

$ cat hello.sh 
#!/bin/bash 
echo "Hello World"
$ bash -x hello.sh 
+ echo Hello World
Hello World

L’argument -x vous permet de parcourir chaque ligne du script. Un bon exemple est ici:

$ cat hello.sh
#!/bin/bash 
echo "Hello World\n" 
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number) 

$ ./hello.sh 
Hello World

expr: non-integer argument

L’erreur ci-dessus n’est pas suffisante pour tracer le script ; cependant, l’utilisation de la méthode suivante vous donne une meilleure idée de l’endroit où rechercher l’erreur dans le script.

$ bash -x hello.sh 
+ echo Hello World\n
Hello World

+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=

Gestion des arguments nommés

#!/bin/bash

deploy=false
uglify=false

while (( $# > 1 )); do case $1 in
   --deploy) deploy="$2";;
   --uglify) uglify="$2";;
   *) break;
 esac; shift 2
done

$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"

# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false