Introduction aux scripts Bash Shell

Une vue d'ensemble détaillée du script de Bash Shell

Le script Shell est un moyen puissant d'automatiser les tâches que vous exécutez régulièrement sur votre ordinateur.

Dans ce didacticiel, je donne un aperçu complet des scripts shell et je serai la référence de base pour des didacticiels plus approfondis et avancés sur la création de scripts shell pratiques.

Découvrez monintroduction à BashPublier.

Bash vous donne un ensemble de commandes qui peuvent être utilisées pour créer de petits programmes, que par convention nous appelons des scripts.

Notez la différence. Nous ne parlons pas de programmation Bash mais de scripts Bash, et nous n'appelons pas les scripts Bash «programmes Bash». En effet, vous pouvez généralement atteindre un certain degré de complexité avant de sentir que vos scripts deviennent incontrôlables.

Mais les scripts Bash sont excellents car vous n'avez besoin de rien d'autre que Bash pour les exécuter. Pas de compilateur, pas d'interpréteur, juste votre shell.

Il y a beaucoup de choses qui vous manqueront dans les langages de programmation comme Perl, JavaScript ou Python.

Les variables n'ont pas de portée, elles sont toutes globales, il n'y a pas de bibliothèque standard, vous n'avez pas de système de modules, par exemple. Mais les avantages sont assez grands: vous pouvez très facilement invoquer n'importe quel outil CLI comme vous l'étiez dans le shell, et l'approche Unix consistant à avoir de nombreuses petites commandes utilitaires fait vraiment briller les scripts shell. Effectuer des requêtes réseau avecwget, traiter le texte en utilisantawk, et plus.

Le script Shell est l'un des outils que vous feriez mieux de connaître, au moins de savoir comment lire un programme lorsque vous le voyez, et les avantages qu'il peut apporter dans votre travail quotidien.

Ce didacticiel vous guide vers la théorie et les concepts de la création de scripts Bash. Je publierai des tutoriels plus détaillés sur des techniques spécifiques ou sur la manière de résoudre des problèmes spécifiques à l'avenir.

Basiques

Les scripts sont stockés dans des fichiers. Vous pouvez donner n'importe quel nom et extension à un script shell, cela n'a pas d'importance. L'important est qu'il doit commencer par un «shebang» sur la première ligne:

#!/bin/bash

et ce doit être un fichier exécutable.

Un fichier est défini comme exécutable en utilisantchmod, une commande utilitaire.

Vous pouvez l'utiliser comme ceci:

chmod u+x myscript

pour faire lemyscriptfichier exécutable pour votre utilisateur (je ne vais pas dans le trou du lapin des autorisations ici, mais je les couvrirai bientôt).

Vous pouvez maintenant exécuter le script si vous êtes dans le même dossier en l'appelant./myscript, ou en utilisant le chemin d'accès complet.

Tout en apprenant, je vous encourage - si possible - à utiliser un terrain de jeu en lignecomme celui-ci, cela rend les choses plus faciles à tester.

commentaires

Les commentaires sont l'une des choses les plus importantes lors de l'écriture de programmes. Une ligne commençant par le#le symbole est un commentaire (à l'exception de la ligne shebang que vous avez vue ci-dessus ici).

#!/bin/bash
# this is a comment

Un commentaire peut également commencer à la fin d'une ligne:

#!/bin/bash
echo ok # this is a comment

Variables

Vous pouvez définir des variables en utilisant le=opérateur:

name=value

Exemples:

ROOM_NUMBER=237
name=Flavio
nickname="Flavio"

Vous pouvez imprimer une variable en utilisant leechocommande intégrée et ajouter un$au nom de var:

echo $ROOM_NUMBER
echo $name

Les opérateurs

Bash implémente certains opérateurs arithmétiques couramment utilisés dans les langages de programmation:

  • +ajouter
  • -soustraire
  • *multiplier
  • /diviser
  • %modulo (reste de la division)
  • **exponentiation

Vous pouvez comparer les valeurs en utilisant

  • <
  • <=
  • ==
  • >=
  • >

Vous pouvez également utiliser ces opérateurs de comparaison:

  • -ltplus bas que
  • -gtplus grand que
  • -leinférieur ou égal à
  • -gesupérieur ou égal à
  • -eqégal à
  • -nepas égal à

De cette façon:

#!/bin/bash
age=23
minimum=18
if test $age -lt $minimum
then
  echo "Not old enough"
fi

Opérateurs logiques:

  • &&ET logique
  • ||OU logique

Ces raccourcis permettent d'effectuer une opération arithmétique puis une affectation:

  • +=
  • -=
  • *=
  • /=
  • %=

Il existe d'autres opérateurs, mais ce sont les plus courants.

Vous pouvez imprimer n'importe quoi à l'écran à l'aide duechocommander:

#!/bin/bash
echo "test"
echo test
echo testing something

Conditions logiques

AND: évalue à0(zéro) si les deuxcommandetanothercommandexécuter et retourner0. Renvoyer zéro dans les commandes shell signifie que la commande a réussi. Un message d'erreur est identifié par une valeur de retour différente de zéro.

command && anothercommand

OU: évalue à0(zéro) si au moins un descommandetanothercommandexécuter et retourner0.

command || anothercommand

NOT: inverser la valeur de retour logique decommand:

! command

Structures de contrôle

Dans, vous pouvez utiliser plusieurs structures de contrôle que vous connaissez peut-être:

Instructions if / else

Simpleif:

if condition
then
  command
fi

ifalorselse:

if condition
then
  command
else
  anothercommand
fi

Imbriquéif- alors -else:

if condition
then
  command
elif
  anothercommand
else
  yetanothercommand
fi

Vous pouvez garder leelsesur la même ligne en utilisant un point-virgule:

if condition ; then
  command
fi

Exemple:

#!/bin/bash
DOGNAME=Roger
if [ "$DOGNAME" == "" ]; then
  echo "Not a valid dog name!"
else
  echo "Your dog name is $DOGNAME"
fi

Remarquez les crochets? Nous devons ajouter des crochets lorsque nous devons faire n'importe quel type d'évaluation d'une expression booléenne.

Boucles

Alors que la boucle

Tandis queconditionse résout à une valeur vraie, exécutezcommand

while condition
do
  command
done

Jusqu'à

Jusqu'àconditionse résout à une valeur vraie, exécutezcommand

until condition
do
  command
done

Pour dans

Itérer une liste et exécuter une commande pour chaque élément

for item in list
do
  command
done

Pause et continuer

À l'intérieur des boucles, vous pouvez utiliser lebreaketcontinuepour rompre complètement la boucle, ou simplement sauter l'itération actuelle.

Cas

Une structure de contrôle de cas vous permet de choisir différents itinéraires en fonction d'une valeur.

case value in
  a)
    command
    #...
    ;;
  b)
    command
    #...
    ;;
esac

Comme avecfi,esactermine la structure de cas et comme vous pouvez le constater, c'estcaseépelé a l'envers.

Nous ajoutons un double point-virgule après chaque cas.

UNE*)case traiterait tous les cas non explicitement exprimés. Utilisant un|symbole, vous pouvez exprimer plusieurs choix pour un seul cas.

Exemple:

#!/bin/bash
read -p "How many shoes do you have?" value
case $value in
  0|1)
    echo "Not enough shoes! You can't walk"
    ;;
  2)
    echo "Awesome! Go walk!"
    #...
    ;;
  *)
    echo "You got more shoes than you need"
    #...
    ;;
esac

Sélectionner

UNEselectla structure montre à l'utilisateur un menu de choix à choisir:

select item in list
do
  command
done

Exemple:

#!/bin/bash
select breed in husky setter "border collie" chiwawa STOP
do
  if [ "$breed" == "" ]; then
    echo Please choose one;
  else
    break
  fi
done

echo “You chose $breed

Conditions d'essai

J'ai utilisé le termeconditiondans les structures de contrôle ci-dessus.

Vous pouvez utiliser letestCommande intégrée Bash pour vérifier une condition et renvoyer un vrai (0) ou une fausse valeur (pas0).

Voici un exemple:

#!/bin/bash
if test "apples" == "apples"
then
  echo Apples are apples
fi

if ! test “apples” == “oranges” then echo Apples are not oranges fi

Lecture de l'entrée à partir de la ligne de commande

Vous pouvez rendre vos scripts interactifs en utilisant lereadcommande intégrée. Cette commande lit une ligne à partir de l'entrée standard et peut formater l'entrée d'une manière très flexible.

L'utilisation la plus simple est:

echo "Age:"
read age

cela va imprimer «Âge:» et vous pouvez entrer un numéro, appuyez sur Entrée et ce numéro sera attribué auagevariable.

Le-poption dereadfournit une invite intégrée et place l'entrée dans leagevariable:

read -p "Age: " age

LereadLa commande a beaucoup plus d'options, que vous pouvez inspecter en tapanthelp readà Bash.

Ajout d'options

Les options sont spécifiées à l'aide d'un trait d'union suivi d'une lettre, comme ceci:

ls -a
driveCar -b "Ford"

Dans votre code, vous utilisez la commande intégréegetoptspour analyser les options et obtenir la valeur.

Si nous acceptons les optionsaetb, nous nourrissonsgetopts abà une boucle while.

Si optionbaccepte une valeur, nous ajoutons un deux-points:après, nous formaterons notregetoptsappelez comme ceci:getopts ab: arg

Voici un extrait:

while getopts xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    esac
done

Dans ce script,$OPTARGreçoit automatiquement la lettre d'option. Nous disonsgetoptsquelles options nous acceptons, et nous traitons chaque cas séparément.

Les erreurs sont gérées automatiquement pargetopts. Nous pouvons choisir de gérer nous-mêmes les messages d'erreur, en ajoutant deux points:avant la définition des arguments:getopts :xy: arg.

Ensuite, nous gérons également le\?et:cas. Le premier est appelé lorsque nous passons une option invalide, et le second est appelé lorsque nous manquons une option:

while getopts :xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    :) echo "$0: Must supply an argument to -$OPTARG." >&2
       exit 1 ;;
    \?) echo "Invalid option -$OPTARG ignored." >&2 ;;
    esac
done

Maintenant, si vous ne parvenez pas à ajouter un argument, les messages d'erreur sont différents.

Travailler avec des paramètres

Dans un script, vous pouvez accéder à n'importe quel paramètre qui a été passé au moment de l'appel. Vous y accédez en utilisant$0,$1,$2et ainsi de suite, selon la position, où$0est le nom de la commande et en incrémentant le nombre la position du paramètre est incrémentée. Après la position 9, vous avez besoin d'accolades:${10},${11}

Par exemple exécuter cecistartCarscénario:

#!/bin/bash
echo $0
echo $1

comme./startCar fiestava imprimer

./startCar
fiesta

Le spécial$*la syntaxe imprime tous les paramètres, et$#le nombre de paramètres passés:

#!/bin/bash
echo $# $*
./test.sh Milan Florence Rome
3 Milan Florence Rome

Séparer les options des paramètres

Si vous avez à la fois des options et des paramètres, vous devez les séparer. Vous faites cela avec un trait d'union:

driveCar -m "Ford Fiesta" - Milan Florence Rome

Travailler avec des chaînes

Étant donné une chaîne:

dogname="Roger"

Vous pouvez obtenir sa longueur en utilisant${#dogname}

Utilisez toujours des guillemets autour des chaînes, lorsque vous travaillez avec elles, pour éviter que Bash n'interprète les caractères spéciaux à l'intérieur.

Vous pouvez comparer 2 chaînes en utilisant le=ou==opérateur, c'est pareil:

"$dogname" = "$anotherdogname"
"$dogname" == "$anotherdogname"

Ce n'est pas une affectation à cause des espaces entourant le=.

Vous pouvez également vérifier les inégalités:

"$dogname" != "$anotherdogname"

Tableaux

Un tableau est une liste d'éléments, déclarés entre parenthèses:

breeds=(husky setter "border collie" chiwawa)

Vous pouvez référencer n'importe quel élément dans un tableau en utilisant des crochets:

breeds[0]
breeds[1]

et vous pouvez obtenir le nombre total d'éléments en utilisant cette syntaxe spéciale:

${#breeds[@]}

Commandes intégrées

Jusqu'à présent, vous avez déjà vu quelques commandes intégrées, comme celles-ci:

  • test
  • read
  • echo

Bash en a un certain nombre. Vous pouvez tous les voir en appelanthelppuis vous pouvez trouver l'aide pour chaque commande en utilisant par exemplehelp read.

Les fonctions

Tout comme en JavaScript ou dans tout autre langage de programmation, vous pouvez créer de petits morceaux de code réutilisables, leur donner un nom et les appeler quand vous en avez besoin.

Bash les appelleles fonctions.

Vous définissez une fonction avec

function name {

}

Exemple:

function cleanFolder {

}

et vous l'invoquez comme ceci:

cleanFolder

Vous pouvez passer des paramètres à des dossiers, sans avoir besoin de les déclarer - il vous suffit de les référencer comme$1,$2etc. Comme vous le faites pour les paramètres de script:

function cleanFolder {
  echo "Clean folder $1"
}
cleanFolder "/Users/flavio/Desktop"

Téléchargez mon gratuitManuel des commandes Linux


Plus de tutoriels cli: