$ si vrai ; alors echo OUI ; sinon echo NON ; fiYES$ si faux ; alors echo OUI sinon echo NON ;
$ si vrai && vrai;puis echo OUI; sinon echo NON; fiOUI $ si vrai && faux;puis echo OUI fiNO$ si faux && faux;puis echo fiNO$ si faux && vrai; ;puis écho OUI ; sinon écho NON ;
$ si vrai || vrai; alors echo OUI; sinon echo NON; fiYES$ si vrai || alors echo echo NON; alors echo OUI $; faux || faux; puis écho OUI, sinon écho NON ;
$ si ! faux ; alors écho OUI ; sinon écho NON ; fiOUI $ si ! écho OUI ; sinon écho NON ;
On peut voir
vraiet
FAUXNous procédons en fonction de notre compréhension des opérations logiques, mais afin de mieux comprendre la mise en œuvre des opérations logiques par Shell, nous devons comprendre :
vraiet
FAUXComment ça marche ?
La réponse est : Non.
vraiet
FAUXCe ne sont pas des valeurs logiques en elles-mêmes, ce sont toutes des commandes intégrées du Shell, mais leur valeur de retour est une « valeur logique » :
$ vrai$ écho $?0$ faux$ écho $?1
peut être vu
vraia renvoyé 0, et
FAUXEnsuite, 1 est renvoyé. Cela ne correspond pas aux vraies valeurs 1 et 0 que nous avons apprises en mathématiques discrètes, mais c'est le contraire.
$ help true falsetrue: true Renvoie un résultat réussi.false: false Renvoie un résultat infructueux.$ type true falsetrue est un shell intégréfalse est un shell intégré
illustrer:
$?Il s'agit d'une variable spéciale qui stocke l'état final (code d'état de sortie) du dernier processus.
À partir des opérations ci-dessus, il n’est pas difficile de comprendre pourquoi l’accent est mis sur la programmation en langage C.
principalAjouter devant la fonction
int, et ajoutez à la fin
retourner 0. Parce que dans le Shell, 0 sera utilisé pour indiquer si le programme se termine avec succès. C'est ce que fait le Shell.
vraiet
FAUXEssentiellement, ils sont utilisés pour indiquer si un certain programme se termine correctement, plutôt que les valeurs vraies et fausses traditionnelles (1 et 0). Au contraire, ils renvoient 0 et 1. Heureusement, nous n'avons pas à nous en soucier lorsque nous effectuons des opérations logiques.
De la section précédente, nous avons clairement compris ce qu'est la "valeur logique" sous Shell : c'est la valeur de retour lorsque le processus se termine, s'il renvoie avec succès, c'est vrai, s'il échoue, c'est faux.
Et le test conditionnel utilise simplement
testUne telle instruction est utilisée pour effectuer des tests numériques (divers tests d'attributs numériques), des tests de chaînes (divers tests d'attributs de chaîne) et des tests de fichiers (divers tests d'attributs de fichiers). Nous jugeons si le test correspondant est réussi, après avoir terminé diverses tâches de routine. , couplé à la combinaison logique de divers tests, des tâches plus complexes peuvent être réalisées.
$ si test 5 -eq 5;puis écho OUI; sinon écho NON; fiOUI$ si test 5 -ne 5;puis écho OUI sinon écho NON;
$ si test -n n'est pas vide ; alors echo OUI ; sinon echo NON ; fiYES$ si test -z n'est pas vide ; alors echo echo NON ; alors echo OUI sinon echo NON ; si test -n ; alors echo OUI sinon echo NON ;
$ if test -f /boot/System.map; then echo OUI ; sinon echo NO ;
$ a=5;b=4;c=6;$ if test $a -eq 5 -a $b -eq 4 -a $c -eq 6 alors echo OUI sinon echo NON ;
$ if test -f /etc/profile -o -d /etc/profile;then echo OUI sinon echo NON ;
!PAS de fonctionnement
$ if test ! -f /etc/profile; alors echo OUI sinon echo NON ;
Ce qui précède démontre seulement
testCommandez des tests très simples que vous pouvez réussir
aider à testerObtenir
testPlus d'utilisations de . Il convient de noter que
testIl existe quelques différences entre les opérations logiques à l'intérieur de la commande et les opérateurs logiques du Shell. Les opérations correspondantes sont :
-unet
&&,
-oet
||, les deux ne peuvent pas être confondus. Plutôt que les opérations soient
!, comparez-les ci-dessous.
$ cat > test.sh#!/bin/bashecho test[CTRL+D] # Appuyez sur la combinaison de touches CTRL et D pour terminer la saisie de cat, comme ci-dessous, ne spécifiez plus $ chmod +x test.sh$ if test -s test .sh -a -x test.sh; puis echo OUI, sinon echo NON ;
$ str1=test$ str2=test$ if test -z $str2 -o $str2 == $str1; then echo OUI else fiYES$ if test -z $str2 || puis écho OUI ; sinon écho NON ;
$ i=5$ si test ! $i -lt 5 -a $i -ne 6 ; alors echo OUI ; ; sinon echo NON;
Il est facile de faire la différence entre eux,
-unet
-oEn tant que paramètre de la commande test, il est utilisé à l'intérieur de la commande test, et
&&et
||Il permet de calculer la valeur de retour du test,
!Commun aux deux. Ce qui mérite attention, c'est :
Parfois, ce n'est pas nécessaire
!opérateur, tel que
-eqet
-neAu contraire, il peut être utilisé pour tester si deux valeurs sont égales ;
-zet
-nIl correspond également et est utilisé pour tester si une certaine chaîne est vide.
exister
Frapperà l'intérieur,
testLes commandes peuvent être remplacées par l'opérateur [], mais il convient de noter que [
Ensuite avec] doit être précédé d'espaces supplémentaires
Lors du test d'une chaîne, il est recommandé de mettre toutes les variables entre guillemets doubles pour éviter la situation où il n'y a que des paramètres de test et aucun contenu de test lorsque le contenu de la variable est vide.
Ci-dessous, nous utilisons des exemples pour démontrer les trois précautions ci-dessus :
-neet
-eqEn conséquence, nous pouvons parfois nous passer de
!Opération
$ i=5$ si test $i -eq 5 ; alors echo OUI ; sinon echo NON ; puis écho OUI ; sinon écho NON ;
utiliser
[ ]peut remplacer
test, ce sera beaucoup plus « beau »
$ if [ $i -eq 5 ]; alors echo OUI; sinon echo NON;
N'oubliez pas d'ajouter quelques variables de chaîne
,Souviens-toi[Ensuite avec
]Ajoutez un espace supplémentaire avant
$ str=$ if [ $str = test] ; then echo OUI ; else fi-bash : [ : manquant `]'NO$ if [ $str = test ] ; bash : [: = : opérateur unaire attenduNO$ if [ $str = test ] ; then echo YES else echo NO ;
À ce stade, le test conditionnel a été introduit. La liste de commandes est présentée ci-dessous. En fait, nous l'avons déjà utilisée ci-dessus, c'est-à-dire une combinaison de plusieurs commandes de test.
&&,
||et
!Une séquence de commandes combinées. Cette séquence de commandes remplace efficacement
si/alorsstructure de branche conditionnelle. Il n'est pas difficile de penser aux questions à choix multiples suivantes que nous posons souvent en programmation en langage C (exemple très ennuyeux, mais significatif) : Le texte suivant s'imprimera-t-il ?
j, si imprimé, qu'est-ce qui sera imprimé ?
#include <stdio.h>int main(){ int i, j; i=5;j=1; if ((i==5) && (j=5)) printf(%dn, j); renvoie 0 ;}
Il est facile de savoir que le chiffre 5 sera imprimé car
je==5Cette condition est vérifiée, et par la suite
&&, pour juger si la condition entière est établie, il faut porter un jugement ultérieur, mais ce jugement n'est pas un jugement conventionnel, mais d'abord
jModifiez-le à 5 puis convertissez-le en une valeur vraie, donc la condition est vraie et 5 est imprimé. Par conséquent, cette phrase peut être interprétée comme : Si
jeest égal à 5, alors mettez
jAttribuez une valeur de 5 si
jest supérieur à 1 (car c'était déjà vrai avant), puis imprimez
jvaleur. Utilisez-le de cette façon
&&La déclaration de jugement concaténée remplace deux
siInstruction de branchement conditionnelle.
C'est précisément sur la base des propriétés uniques des opérations logiques que nous pouvons transmettre
&&,
||remplacer
si/alorsAttendez la structure de branche conditionnelle, générant ainsi une liste de commandes.
Les règles d'exécution de la liste de commandes sont conformes aux règles de fonctionnement des opérations logiques.
&&Pour les commandes connectées, si la première renvoie avec succès, la commande suivante sera exécutée, sinon utilisez ;
||Si les commandes connectées reviennent avec succès, les commandes suivantes ne seront pas exécutées, et vice versa.
$ ping -c 1 www.lzu.edu.cn -W 1 && echo =======connecté========
Une question très intéressante se pose, c'est ce que nous avons mentionné ci-dessus : pourquoi le programme C devrait-il être
principal()La fonction renvoie-t-elle 0 à la fin ? Sinon, quelles seraient les conséquences de l'ajout de ce type de programme dans la liste des commandes ? Écrivez vous-même un programme C simple, puis placez-le dans la liste de commandes pour le voir.
Parfois, une liste de commandes est utilisée à la place
si/alorsLa structure de branche conditionnelle peut économiser du code et rendre le programme plus beau et plus facile à lire, par exemple :
#!/bin/bashecho $#echo $1if [ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null);then echo YESfi
Remarque : L'exemple ci-dessus nécessite que le nombre de paramètres soit de 1 et que le type soit numérique.
Plus
sortie 1, nous omettrons
si/alorsstructure
#!/bin/bashecho $#echo $1 ([ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null)) && exit 1echo OUI
Après ce traitement, le jugement des paramètres du programme ne nécessite qu'une simple ligne de code, et cela devient plus beau.
Cette section présente les opérations logiques, les tests conditionnels et les listes de commandes dans la programmation Shell.