Salut à tous,
dans mes scripts shell, j'utilise souvent une fonction qui rend un code de retour.
Selon la valeur de ce code de retour, j'effectue un traitement différent; pour cela, j'effectue le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 1 #!/bin/bash -x 2 3 function_test () 4 { 5 case $1 in 6 [0-9]) 7 echo "\$1 valide" 8 ;; 9 *) 10 echo "erreur \$1" 11 exit 2 12 ;; 13 esac 14 return $1 15 }
Je souhaiterai "compacter" ce code afin de réduire la taille de mes scripts.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 16 17 #code classique, long ! 18 #analyse du code de retour de la fonction et traitement adequat 19 function_test $1 20 if [ $? -eq 0 ] 21 then 22 echo "traitement ok" 23 date 24 echo "ok" 25 else 26 echo "traitement erreur" 27 uptime 28 exit 1 29 fi
Pour cela, j'utilise les opérateurs d’exécution conditionnelle && et || et j'utilise un opérateur de groupement { }.
Ce code fonctionne, le exit est bien pris en compte et les instructions suivantes ne sont pas traitées en cas d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 31 #syntaxe 1 32 #utilisation de l execution conditionnelle. groupement des instructions avec {}. fonctionne OK. 33 [ $? -eq 0 ] && { echo "traitement ok" ;date ; echo "ok"; } || { echo "traitement erreur." ; uptime ; exit 1 ; }
J'ai également voulu tester les () pour grouper mes commandes, mais le résultat est différent, la suite des commande est exécutée, malgré le exit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 35 #syntaxe 2 36 #utilisation de l execution conditionnelle. groupement des instructions avec ( ) 37 [ $? -eq 0 ] && ( echo "traitement ok" ;date ; echo "ok"; ) || ( echo "traitement erreur." ; uptime ; exit 1 ; )
Voici le résultat avec la syntaxe 1 :
Voici le résultat avec la syntaxe 2, exécution se poursuit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 [benoit@benoit src]$ if.sh 1 + function_test 1 + case $1 in + echo '$1 valide' $1 valide + return 1 + '[' 1 -eq 0 ']' + echo 'traitement erreur.' traitement erreur. + uptime 21:50:40 up 2:42, 3 users, load average: 0.00, 0.01, 0.05 + exit 1
J'ai effectué une recherche sur les opérateurs de groupement de commandes, voici ce que j'ai trouvé et qui ne m'explique pas la différence de comportement entre les 2 codes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 [benoit@benoit src]$ if.sh 1 + function_test 1 + case $1 in + echo '$1 valide' $1 valide + return 1 + '[' 1 -eq 0 ']' + echo 'traitement erreur.' traitement erreur. + uptime 21:52:00 up 2:43, 4 users, load average: 0.04, 0.03, 0.05 + exit 1 + echo 'la suite des instructions' la suite des instructions
3.2.4.3 Grouping Commands
Bash provides two ways to group a list of commands to be executed as a unit. When commands are grouped, redirections may be applied to the entire command list. For example, the output of all the commands in the list may be redirected to a single stream.
()
( list )
Placing a list of commands between parentheses causes a subshell environment to be created (see Command Execution Environment), and each of the commands in list to be executed in that subshell. Since the list is executed in a subshell, variable assignments do not remain in effect after the subshell completes.
{}
{ list; }
Placing a list of commands between curly braces causes the list to be executed in the current shell context. No subshell is created. The semicolon (or newline) following list is required.
In addition to the creation of a subshell, there is a subtle difference between these two constructs due to historical reasons. The braces are reserved words, so they must be separated from the list by blanks or other shell metacharacters. The parentheses are operators, and are recognized as separate tokens by the shell even if they are not separated from the list by whitespace.
The exit status of both of these constructs is the exit status of list.
Comment expliquer cette différence de comportement ?
merci d'avance,
ben.![]()
Partager