Dans ce didacticiel, nous allons parler des scripts shell et de la création de votre premier script shell. Ils sont appelés scripts shell en général, mais nous allons les appeler scripts Bash car nous allons utiliser Bash parmi les autres shells Linux.
Il existe zsh, tcsh, ksh et d'autres shells.
Dans les articles précédents, nous avons vu comment utiliser le shell Bash et comment utiliser les commandes Linux.
Le concept d'un script Bash est d'exécuter une série de commandes pour faire votre travail.
Pour exécuter plusieurs commandes en une seule étape à partir du shell, vous pouvez les saisir sur une seule ligne et les séparer par des points-virgules.
pwd ; whoami
Ceci est un script Bash !!
La commande pwd s'exécute en premier, affichant le répertoire de travail actuel, puis la commande whoami s'exécute pour afficher les utilisateurs actuellement connectés.
Vous pouvez exécuter plusieurs commandes autant que vous le souhaitez, mais avec une limite. Vous pouvez déterminer votre maximum d'arguments à l'aide de cette commande.
getconf ARG_MAX
Eh bien, qu'en est-il de mettre les commandes dans un fichier, et lorsque nous devons exécuter ces commandes, nous exécutons uniquement ce fichier. C'est ce qu'on appelle un script Bash.
Tout d'abord, créez un nouveau fichier à l'aide de la commande touch. Au début de tout script Bash, nous devons définir quel shell nous allons utiliser car il existe de nombreux shells sous Linux, Bash shell en fait partie.
Symbole de script shell
La première ligne que vous saisissez lors de l'écriture d'un script Bash est le (# !) suivi du shell que vous utiliserez.
# ! <===ce signe s'appelle shebang.
#!/bin/bash
Si vous utilisez le signe dièse (#) devant n'importe quelle ligne de votre script shell, cette ligne deviendra un commentaire, ce qui signifie qu'elle ne sera pas traitée, mais la ligne ci-dessus est un cas particulier. Cette ligne définit le shell que nous allons utiliser, qui est le shell Bash dans notre cas.
Les commandes shell sont saisies une par ligne comme ceci :
#!/bin/bash # This is a comment pwd whoami
Vous pouvez taper plusieurs commandes sur la même ligne, mais vous devez les séparer par des points-virgules, mais il est préférable d'écrire les commandes sur des lignes séparées; cela facilitera la lecture plus tard.
Définir l'autorisation de script
Après avoir écrit votre script shell, enregistrez le fichier.
Maintenant, définissez ce fichier pour qu'il soit exécutable ; sinon, il vous donnera l'autorisation refusée. Vous pouvez revoir comment définir les autorisations à l'aide de la commande chmod.
chmod +x ./myscript
Ensuite, essayez de l'exécuter en le tapant simplement dans le shell :
./myscript
Et oui, il est exécuté.
Créez votre premier script Bash
Comme nous le savons par d'autres articles, l'impression de texte se fait à l'aide de
echo
commande.
Modifiez votre fichier et saisissez ceci :
#!/bin/bash # our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami
Regardez la sortie :
Parfait! Nous pouvons maintenant exécuter des commandes et afficher du texte :
echo
Si vous ne connaissez pas la commande echo ou comment modifier un fichier, je vous recommande de consulter les articles précédents sur les commandes Linux de base.
Utiliser des variables
Les variables vous permettent de stocker des informations pour les utiliser dans votre script.
Vous pouvez définir deux types de variables dans votre script shell :
- Variables d'environnement
- Variables utilisateur
Variables d'environnement
Parfois, vous devez interagir avec des variables système; vous pouvez le faire en utilisant des variables d'environnement.
#!/bin/bash # display user home echo "Home for the current user is: $HOME"
Notez que nous plaçons la variable système $HOME entre guillemets doubles et qu'elle imprime correctement la variable home.
Et si nous voulions imprimer le signe dollar lui-même ?
echo "I have $1 in my pocket"
Étant donné que la variable $1 n'existe pas, elle ne fonctionnera pas. Alors, comment surmonter cela ?
Vous pouvez utiliser le caractère d'échappement, qui est la barre oblique inverse \ avant le signe dollar comme ceci :
echo "I have \$1 in my pocket"
Maintenant ça marche !!
Variables utilisateur
Vous pouvez également définir et utiliser vos variables personnalisées dans le script.
Vous pouvez appeler des variables utilisateur de la même manière :
#!/bin/bash # User variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
chmod +x myscript ./myscript
Remplacement de commande
Vous pouvez extraire des informations du résultat d'une commande en utilisant la substitution de commande.
Vous pouvez effectuer une substitution de commande avec l'une des méthodes suivantes :
- Le caractère de backtick (`).
- Le format $().
Assurez-vous que lorsque vous tapez le caractère backtick, ce n'est pas le guillemet simple.
Vous devez entourer la commande de deux backticks comme ceci :
mydir=`pwd`
Ou dans l'autre sens :
mydir=$(pwd)
Le script pourrait donc ressembler à ceci :
#!/bin/bash mydir=$(pwd) echo $mydir
Vous pouvez stocker le résultat de la commande dans la variable mydir.
Calcul mathématique
Vous pouvez effectuer des calculs mathématiques de base en utilisant le format $(( 2 + 2 )) :
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2
C'est aussi simple que ça.
instruction si-alors
Vos scripts shell auront besoin d'instructions conditionnelles. Par exemple, si la valeur est inférieure à 10, faites ceci, sinon faites cela. Vous pouvez imaginer la logique que vous voulez.
La structure la plus basique de l'instruction if-then est la suivante :
si commande ; alors
faire quelque chose
fi
et voici un exemple :
#!/bin/bash if whoami; then echo "It works" fi
Depuis le
whoami
renverra mon utilisateur afin que la condition revienne vraie, et il imprimera le message.
Allons plus loin et utilisons d'autres commandes que nous connaissons.
Vérifier si un utilisateur existe
Peut-être rechercher un utilisateur spécifique dans le fichier de l'utilisateur
/etc/passwd
et si un enregistrement existe, dites-le moi dans un message.
#!/bin/bash user=likegeeks if grep $user /etc/passwd; then echo "No such a user $user" fi
Nous utilisons le
/etc/passwd
dossier. Vous pouvez consulter notre tutoriel sur la commande grep.
Si l'utilisateur existe, le script shell imprimera le message.
Que faire si l'utilisateur n'existe pas ? Le script quittera l'exécution sans nous dire que l'utilisateur n'existe pas. OK, améliorons davantage le script.
instruction si-alors-sinon
L'instruction if-then-else adopte la structure suivante :
si commande ; alors
faire quelque chose
sinon
faire autre chose
fi
Si la première commande s'exécute et renvoie zéro, ce qui signifie un succès, elle ne touchera pas les commandes après l'instruction else ; sinon, si l'instruction if renvoie une valeur différente de zéro ; ce qui signifie que la condition de l'instruction échoue, dans ce cas, le shell lancera les commandes après l'instruction else.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi
Nous allons bien jusqu'à présent, continuez à avancer.
Maintenant, que se passe-t-il si nous avons besoin de plus d'instructions else ?
Eh bien, c'est facile, nous pouvons y parvenir en imbriquant des déclarations if comme celle-ci :
si condition1 ; alors
commandes
condition elif2 ; alors
commandes
fi
Si la première commande renvoie zéro ; signifie succès, il exécutera les commandes après, sinon si la deuxième commande renvoie zéro, il exécutera les commandes après, sinon si aucune ne renvoie zéro, il n'exécutera que les dernières commandes.
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" elif ls /home; then echo "The user doesn’t exist" fi
Vous pouvez imaginer n'importe quel scénario, peut-être que si l'utilisateur n'existe pas, créez un utilisateur à l'aide de
useradd
commander ou faire quoi que ce soit d'autre.
Combiner les tests
Vous pouvez combiner plusieurs tests à l'aide de la commande AND (&&) ou OR (||).
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] && [ -n $name ]; then echo "The name exists and the folder $dir exists." else echo "One test failed" fi
Cet exemple renverra true uniquement si les deux tests ont réussi; sinon, cela échouera.
Vous pouvez également utiliser OR (||) de la même manière :
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] || [ -n $name ]; then echo "Success!" else echo "Both tests failed" fi
Cet exemple renverrait le succès si l'un ou les deux réussissaient.
Cela n'échouerait que si les deux échouaient.
Comparaisons numériques
Vous pouvez effectuer une comparaison numérique entre deux valeurs numériques à l'aide de vérifications de comparaison numérique comme ceci :
nombre1 -eq nombre2 Vérifie si nombre1 est égal à nombre2.
nombre1 -ge nombre2 Vérifie si nombre1 est supérieur ou égal à nombre2.
number1 -gt number2 Vérifie si number1 est supérieur à number2.
nombre1 -le nombre2 Vérifie si nombre1 est inférieur ou égal à nombre2.
nombre1 -lt nombre2 Vérifie si nombre1 est inférieur à nombre2.
nombre1 -ne nombre2 Vérifie si nombre1 n'est pas égal à nombre2.
À titre d'exemple, nous allons essayer l'un d'entre eux, et le reste est le même.
Notez que l'instruction de comparaison est entre crochets, comme indiqué.
#!/bin/bash num=11 if [ $num -gt 10]; then echo "$num is bigger than 10" else echo "$num is less than 10" fi
Le nombre est supérieur à dix, il exécutera donc la première instruction et imprimera le premier écho.
Comparaisons de chaînes
Vous pouvez comparer des chaînes de l'une des manières suivantes :
string1 =string2 Vérifie si string1 est identique à string2.
string1 !=string2 Vérifie si string1 n'est pas identique à string2.
string1
string1> string2 Vérifie si string1 est supérieur à string2.
-n string1 Vérifie si string1 est plus long que zéro.
-z string1 Vérifie si string1 est de longueur nulle.
Nous pouvons appliquer une comparaison de chaînes à notre exemple :
Une remarque délicate sur le supérieur à et inférieur à pour les comparaisons de chaînes, ils DOIVENT être échappé avec la barre oblique inverse car si vous utilisez uniquement le symbole supérieur à, les résultats sont erronés.
Donc, vous devriez le faire comme ça :
Il s'exécute, mais il donne cet avertissement :
Pour résoudre ce problème, enveloppez les $vals avec un guillemet double, en le forçant à rester comme une chaîne comme ceci :
Une note critique sur supérieur à et inférieur à pour les comparaisons de chaînes. Consultez l'exemple suivant pour comprendre la différence :
comme les geeks
Comme les geeks
La condition de test considère les lettres minuscules plus grandes que les lettres majuscules.
Contrairement à la commande sort, qui fait le contraire.
La condition de test est basée sur l'ordre ASCII.
Alors que la commande de tri est basée sur les ordres de numérotation des paramètres système.
Vous pouvez comparer et rechercher des fichiers à l'aide des opérateurs suivants :
-d mon_fichier Vérifie s'il s'agit d'un dossier.
-e mon_fichier Vérifie si le fichier est disponible.
-f my_file Vérifie si c'est un fichier.
-r mon_fichier Vérifie s'il est lisible.
mon_fichier – nt my_file2 Vérifie si my_file est plus récent que mon_fichier2.
mon_fichier – ot my_file2 Vérifie si my_file est plus ancien que mon_fichier2.
-O my_file Vérifie si le propriétaire du fichier et l'utilisateur connecté correspondent.
-G my_file Vérifie si le fichier et l'utilisateur connecté ont un groupe identique.
Comme ils l'impliquent, vous ne les oublierez jamais.
Choisissons-en un et prenons-le comme exemple :
Nous n'allons pas taper chacun d'entre eux à titre d'exemple. Il vous suffit de taper la comparaison entre les crochets telle quelle et de terminer votre script normalement.
Il existe d'autres fonctionnalités avancées si-alors, mais parlons-en dans un autre article.
C'est pour maintenant. J'espère que vous l'apprécierez et que vous continuerez à pratiquer de plus en plus.
Merci.#!/bin/bash
user="likegeeks"
if [ $user = $USER ]; then
echo "The user $user is the current logged in user"
fi
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
./myscript: line 5: [: too many arguments
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
#!/bin/bash
v1=Likegeeks
v2=likegeeks
if [ $v1 \> $v2 ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
sort myfile
sort
sort
Comparaisons de fichiers
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]; then
echo "Directory $mydir exists"
cd $mydir
ls
else
echo "NO such file or directory $mydir"
fi