BashDémarrer avec Bash


Versions

Version Date de sortie
0,99 1989-06-08
1,01 1989-06-23
2.0 1996-12-31
2,02 1998-04-20
2,03 1999-02-19
2,04 2001-03-21
2.05b 2002-07-17
3.0 2004-08-03
3.1 2005-12-08
3.2 2006-10-11
4.0 2009-02-20
4.1 2009-12-31
4.2 2011-02-13
4.3 2014-02-26
4.4 2016-09-15

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
 

Bonjour le monde

Shell interactif

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 ou sur Unix utilisent Bash comme shell par défaut (notamment Linux et macOS). Le terminal entre automatiquement dans un processus interactif de shell Bash au démarrage.

Sortez Hello World en tapant 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 est une commande intégrée Bash qui écrit les arguments reçus 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 ne nécessite aucune interaction humaine. Le comportement interactif et le comportement par script doivent être identiques - une considération importante pour la conception du shell Unix V7 Bourne et de Bash de manière transitoire. Par conséquent, tout ce qui peut être fait sur la ligne de commande peut être placé dans un fichier 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. Rendre le script exécutable en exécutant chmod +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é shebang 1 . Le shebang demande au système d'exploitation d'exécuter /bin/bash , le shell Bash, en lui transmettant le chemin du script comme argument.

    Par exemple /bin/bash hello-world.sh

    Ligne 2 : Utilise la commande echo 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'un des éléments suivants:

    • ./hello-world.sh - le plus couramment utilisé et recommandé
    • /bin/bash hello-world.sh
    • bash hello-world.sh - en supposant que /bin soit dans votre $PATH
    • sh hello-world.sh

Pour une utilisation en production réelle, vous devez omettre l’extension .sh (ce qui est trompeur, car il s’agit d’un script Bash, et non d’un script sh ) et peut-être déplacer le fichier dans un répertoire de votre PATH 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 les droits d'exécution sur le fichier, c'est-à-dire chmod +x hello-world.sh , ce qui entraîne la sortie de ./hello-world.sh: Permission denied .

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

    Un symptôme courant est : command not found lorsque le retour chariot a forcé le curseur au début de la ligne, remplaçant le texte précédant les deux points dans le message d'erreur.

    Le script peut être corrigé à l'aide du programme dos2unix .

    Un exemple d'utilisation: dos2unix hello-world.sh

    dos2unix édite le fichier en ligne.

  3. En utilisant sh ./hello-world.sh , ne réalisant pas que bash et sh sont des shells distincts avec des fonctionnalités distinctes (bien que Bash est rétro-compatible, l'erreur inverse est inoffensive).

    Quoi qu'il en soit, il est préférable d'utiliser la ligne shebang du script plutôt que d'écrire explicitement bash ou sh (ou python ou perl ou awk ou ruby ou ...) avant le nom de fichier de chaque script.

    Une ligne de shebang commune à utiliser pour rendre votre script plus portable consiste à utiliser #!/usr/bin/env bash au lieu de coder en dur un chemin vers Bash. De cette façon, /usr/bin/env doit exister, mais au-delà, bash doit simplement être sur votre PATH . Sur de nombreux systèmes, /bin/bash n'existe pas et vous devez utiliser /usr/local/bin/bash ou un autre chemin absolu; Ce changement évite de devoir en comprendre les détails.


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

Bonjour tout le monde en mode "Debug"

$ 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 suggérée ci-dessus n'est pas suffisante pour tracer le script; Cependant, l'utilisation de la méthode suivante vous permet de mieux détecter 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=
 

Bonjour tout le monde en utilisant des variables

Créez un nouveau fichier appelé hello.sh avec le contenu suivant et attribuez-lui des droits 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 lorsqu’elle sera exécutée.

Pour dire à bash où le script est, 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 du répertoire en cours. 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 cité en double citation, et non en guichet unique. "$1" développe comme le premier argument de la ligne de commande, tandis que '$1' évalué à la chaîne littérale $1 .

Note de sécurité:
Lisez les implications de la sécurité en oubliant de citer une variable dans les shells bash pour comprendre l'importance de placer le texte variable entre guillemets.

Bonjour tout le monde avec entrée utilisateur

Ce qui suit invitera l'utilisateur à saisir des données, puis stockera cette entrée sous forme de chaîne (texte) dans une variable. La variable est ensuite utilisée pour donner un message à l'utilisateur.

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

La commande read here lit une ligne de données de l'entrée standard dans le name la variable. Ceci est ensuite référencé en utilisant $name et imprimé en standard avec echo .

Exemple de sortie:

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

Ici, l'utilisateur a entré le nom "Matt", et ce code a été utilisé pour dire Hello, 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 illustré 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 de citer dans les chaînes

La citation est importante pour l'expansion des chaînes en 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 devis:

  • Faible : utilise des guillemets doubles: "
  • Fort : utilise des guillemets simples: '

Si vous voulez vous baser 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 étendre votre argument, vous pouvez utiliser Strong Quoting :

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

Vous pouvez également utiliser la commande escape pour empêcher l'expansion:

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

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

Affichage des informations sur les éléments intégrés Bash

help <command>
 

Cela affichera la page d'aide Bash (manuelle) pour le intégré spécifié.

Par exemple, help unset affichera:

unset: unset [-f] [-v] [-n] [name ...]
   Unset values and attributes of shell variables and functions.

   For each NAME, remove the corresponding variable or function.

   Options:
     -f    treat each NAME as a shell function
     -v    treat each NAME as a shell variable
     -n    treat each NAME as a name reference and unset the variable itself
       rather than the variable it references

   Without options, unset first tries to unset a variable, and if that fails,
   tries to unset a function.

   Some variables cannot be unset; also see `readonly'.

   Exit Status:
   Returns success unless an invalid option is given or a NAME is read-only.
 

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

help -d