From 3f68749a7b43bbf1eac0c49a37357601eb75a69a Mon Sep 17 00:00:00 2001 From: Mickael Asseline Date: Mon, 17 May 2021 10:27:04 +0000 Subject: [PATCH] docs: update Scripting/Bash --- Scripting/Bash.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting/Bash.html b/Scripting/Bash.html index c4d3a21..0b47d7d 100644 --- a/Scripting/Bash.html +++ b/Scripting/Bash.html @@ -2,7 +2,7 @@ title: Scripting - Bash description: Les bases de l'automatisation ! published: true -date: 2021-05-17T09:30:30.816Z +date: 2021-05-17T10:27:03.194Z tags: editor: ckeditor dateCreated: 2021-05-17T08:41:21.766Z @@ -421,4 +421,4 @@ toto n’a pas été supprimé

Lorsqu then ... fi else ... -fi

Tests

Dans les bash, vous retrouverez souvent une notation de commande interne [[ souvent utilisé avec le if. Elle permet l’évaluation de d’expressions conditionnelles portant sur des objets aussi différents que les permissions sur une entrée, la valeur d’une chaîne de caractères ou encore l’état d’une option de la commande interne set.

Syntaxe : [[ expr_conditionelle ]]

Les deux caractères crochets doivent être collés et un caractère séparateur doit être présent de part et d’autre de expr_conditionelle. Les mots [[ et ]] sont des mots-clés. On a vu que le if fonctionne selon la valeur de retour d’une commande, et pas d’un booléen, cette syntaxe permet “d'exécuter un test” qui renverra 1 si le test est vrai, 0 sinon. Si l’expression contient des erreurs syntaxique une autre valeur sera retournée. La commande interne [[ offre de nombreuses expressions conditionnelles, c’est pourquoi seules les principales formes de exp_conditionnelle seront présentées, regroupées par catégories.

Permission

-r entrée vraie si entrée existe et est accessible en lecture par le processus courant
-w entrée vraie si entrée existe et est accessible en écriture par le processus courant
-x entrée vraie si entrée existe et est accessible en exécutable par le processus courant ou si le répertoire entrée existe et

le processus courant possède la permission de passage
Exemple :

 

 

 

1

 

$ echo coucou > toto

2

 

$ chmod 200 toto

3

 

$ ls -l toto

4

 

--w- --- --- 1 christophe christophe 29 juin 1 14:04 toto

5

 

$

6

 

$ if [[ -r toto ]]

7

 

> then cat toto

8

 

> fi

9

 

$ => rien ne ce passe

10

 

$ echo $?

11

 

0 => code de retour de la commande interne if

12

 

$

13

 

MAIS

14

 

$ [[ -r toto ]]

15

 

$ echo $?

16

 

1 => code de retour de la commande interne [[

17

 

$

 

 

Type d’une entrée

-f entrée vraie si entrée existe et est un fichier ordinaire
-d entrée vraie si entrée existe et est un répertoire
Exemple :

 

 

 

1

 

$ cat afficher.sh

2

 

#!/bin/bash

3

 

if [[ -f “$1” ]]

4

 

then

5

 

echo “$1” : fichier ordinaire

6

 

cat “$1”

7

 

elif [[ -d “$1” ]]

8

 

then

9

 

echo “$1” : répertoire

10

 

ls “$1”

11

 

else

12

 

echo “$1” : type non traité

13

 

fi

14

 

15

 

$ ./afficher

16

 

. : répertoire

17

 

afficher.sh test.sh toto alpha rm1.sh

18

 

$

 

 

Renseignement divers sur une entrée
-a entrée vraie si entrée existe
-s entrée vraie si entrée existe et sa taille est différente de 0 (un répertoire vide > 0)
entrée 1 -nt entrée 2 vraie si entrée 1 existe et sa date de modification est plus récente que celle de entrée2
entrée1 -ot entrée 2 vraie si entrée1 existe et sa date de modification est plus ancienne que celle de entrée2
Exemple :

 

 

 

1

 

$ > err

2

 

$

3

 

$ ls -l err

4

 

-rw-rw-r-- 1 christophe christophe 0 juin 29 14:30 err

5

 

$ if [[ -a err ]]

6

 

> then echo err existe

7

 

> fi

8

 

err existe

9

 

$ if [[ -s err ]]

10

 

> then echo err n’est pas vide

11

 

> else err est vide

12

 

> fi

13

 

err est vide

14

 

$

 

 

Longueur d’une chaîne de caractère

-Z ch vraie si la longueur de ch est égale à 0
ch ou (-n ch) vraie si la longueur de ch est différente de 0
ch1 < ch2 vraie si ch1 précède ch2
ch1 > ch2 vraie si ch1 suit ch2
ch == mod vraie si la chaîne ch correspond au modèle mod
ch != mod vraie si la chaîne ch ne correspond pas au modèle mod
-o opt vraie si l’option interne opt est sur on

Important : il existe un opérateur =~ qui permet de mettre en correspondance une chaîne de caractères ch avec une expression
régulière.

Exemple :

 

 

 

1

 

$a=01/01/2010

2

 

$[[ $a =~ [0-9]{2}\/[0-9]{2}\/[0-9]{2,4} ]]

3

 

$ echo $?

4

 

0

5

 

$ a=45/54/1

6

 

$[[ $a =~ [0-9]{2}\/[0-9]{2}\/[0-9]{2,4} ]]

7

 

$ echo $?

8

 

1

 

 

Expressions conditionnelles

( cond ) vraie si cond est vraie
! cond vraie si cond est fausse
cond1 && cond 2 vraie si cond1 et 2 sont vraie, l’évaluation s’arrête si cond1 est fausse
cond1 || cond2 vraie si cond1 ou 2 sont vraie.

Exemple :

 

 

 

1

 

$ ls -l /etc/at.deny

2

 

-rw-r----- 1 root daemon 144 oct. 25 2018 /etc/at.deny

3

 

$

4

 

$ if [[ ! ( -w /etc/at.deny || -r /etc/at.deny ) ]]

5

 

> then

6

 

> echo OUI

7

 

> else

8

 

> echo NON

9

 

> fi

10

 

OUI

 

 

 

 

+fi

Tests

Dans les bash, vous retrouverez souvent une notation de commande interne [[ souvent utilisé avec le if. Elle permet l’évaluation de d’expressions conditionnelles portant sur des objets aussi différents que les permissions sur une entrée, la valeur d’une chaîne de caractères ou encore l’état d’une option de la commande interne set.

Syntaxe : [[ expr_conditionelle ]]

Les deux caractères crochets doivent être collés et un caractère séparateur doit être présent de part et d’autre de expr_conditionelle. Les mots [[ et ]] sont des mots-clés. On a vu que le if fonctionne selon la valeur de retour d’une commande, et pas d’un booléen, cette syntaxe permet “d'exécuter un test” qui renverra 1 si le test est vrai, 0 sinon. Si l’expression contient des erreurs syntaxique une autre valeur sera retournée. La commande interne [[ offre de nombreuses expressions conditionnelles, c’est pourquoi seules les principales formes de exp_conditionnelle seront présentées, regroupées par catégories.

Permission

-r entrée vraie si entrée existe et est accessible en lecture par le processus courant
-w entrée vraie si entrée existe et est accessible en écriture par le processus courant
-x entrée vraie si entrée existe et est accessible en exécutable par le processus courant ou si le répertoire entrée existe et

le processus courant possède la permission de passage

Exemple :

 

 

 

 

1

 

$ echo coucou > toto

2

 

$ chmod 200 toto

3

 

$ ls -l toto

4

 

--w- --- --- 1 christophe christophe 29 juin 1 14:04 toto

5

 

$

6

 

$ if [[ -r toto ]]

7

 

> then cat toto

8

 

> fi

9

 

$ => rien ne ce passe

10

 

$ echo $?

11

 

0 => code de retour de la commande interne if

12

 

$

13

 

MAIS

14

 

$ [[ -r toto ]]

15

 

$ echo $?

16

 

1 => code de retour de la commande interne [[

17

 

$

 

 

Type d’une entrée

-f entrée vraie si entrée existe et est un fichier ordinaire
-d entrée vraie si entrée existe et est un répertoire
Exemple :

 

 

 

1

 

$ cat afficher.sh

2

 

#!/bin/bash

3

 

if [[ -f “$1” ]]

4

 

then

5

 

echo “$1” : fichier ordinaire

6

 

cat “$1”

7

 

elif [[ -d “$1” ]]

8

 

then

9

 

echo “$1” : répertoire

10

 

ls “$1”

11

 

else

12

 

echo “$1” : type non traité

13

 

fi

14

 

15

 

$ ./afficher

16

 

. : répertoire

17

 

afficher.sh test.sh toto alpha rm1.sh

18

 

$

 

 

Renseignement divers sur une entrée
-a entrée vraie si entrée existe
-s entrée vraie si entrée existe et sa taille est différente de 0 (un répertoire vide > 0)
entrée 1 -nt entrée 2 vraie si entrée 1 existe et sa date de modification est plus récente que celle de entrée2
entrée1 -ot entrée 2 vraie si entrée1 existe et sa date de modification est plus ancienne que celle de entrée2
Exemple :

 

 

 

1

 

$ > err

2

 

$

3

 

$ ls -l err

4

 

-rw-rw-r-- 1 christophe christophe 0 juin 29 14:30 err

5

 

$ if [[ -a err ]]

6

 

> then echo err existe

7

 

> fi

8

 

err existe

9

 

$ if [[ -s err ]]

10

 

> then echo err n’est pas vide

11

 

> else err est vide

12

 

> fi

13

 

err est vide

14

 

$

 

 

Longueur d’une chaîne de caractère

-Z ch vraie si la longueur de ch est égale à 0
ch ou (-n ch) vraie si la longueur de ch est différente de 0
ch1 < ch2 vraie si ch1 précède ch2
ch1 > ch2 vraie si ch1 suit ch2
ch == mod vraie si la chaîne ch correspond au modèle mod
ch != mod vraie si la chaîne ch ne correspond pas au modèle mod
-o opt vraie si l’option interne opt est sur on

Important : il existe un opérateur =~ qui permet de mettre en correspondance une chaîne de caractères ch avec une expression
régulière.

Exemple :

 

 

 

1

 

$a=01/01/2010

2

 

$[[ $a =~ [0-9]{2}\/[0-9]{2}\/[0-9]{2,4} ]]

3

 

$ echo $?

4

 

0

5

 

$ a=45/54/1

6

 

$[[ $a =~ [0-9]{2}\/[0-9]{2}\/[0-9]{2,4} ]]

7

 

$ echo $?

8

 

1

 

 

Expressions conditionnelles

( cond ) vraie si cond est vraie
! cond vraie si cond est fausse
cond1 && cond 2 vraie si cond1 et 2 sont vraie, l’évaluation s’arrête si cond1 est fausse
cond1 || cond2 vraie si cond1 ou 2 sont vraie.

Exemple :

 

 

 

1

 

$ ls -l /etc/at.deny

2

 

-rw-r----- 1 root daemon 144 oct. 25 2018 /etc/at.deny

3

 

$

4

 

$ if [[ ! ( -w /etc/at.deny || -r /etc/at.deny ) ]]

5

 

> then

6

 

> echo OUI

7

 

> else

8

 

> echo NON

9

 

> fi

10

 

OUI