Que signifient ces commands?

Quelle serait une façon plus lisible de ces commands?

Et pourquoi exit 255 et non exit 1 ?

 [ $# -eq 3 ] || { echo error ; exit 255 ; } grep -q "ssortingng" && exit 0 

D'autres ont déjà mentionné que $# est le nombre d'arguments de command line, donc je vais ignorer cette partie de votre question.

Donné cmd1 && cmd2 , le shell exécute d'abord cmd1 . Si cmd1 échoue, l'expression entière échoue. Si cmd1 réussit, le shell exécute cmd2 . L'expression entière réussit si cmd1 et cmd2 réussissent. Ainsi, l'opérateur && est le court-circuitage boolean ET appliqué aux commands shell. Les utilisations de cet opérateur peuvent être remplacées par

 if cmd1 then cmd2 fi 

Donné cmd1 || cmd2 cmd1 || cmd2 , le shell exécute d'abord cmd1 . Si cela réussit, l'expression entière réussit. Sinon, le shell exécute cmd2 et le succès ou l'échec de l'expression est déterminé par cmd2 . En bref, il s'agit du court-circuitage boolean OU appliqué aux commands shell. Vous pouvez replace ce formulaire par

 if ! cmd1 then cmd2 fi 

J'ai soigneusement utilisé les phrases suivantes / réussies et échouées / échouées ci-dessus. Le succès, pour les commands shell, est défini comme un état de sortie de process de zéro. L'échec est un état non nul. Cependant, tenter de comprendre les && et || les opérateurs en termes de statuts de sortie est, au less pour moi, déroutant puisque vous vous retrouvez avec une sorte de logique inversée.

C'est assez simple, en fait.

Le script vérifie s'il obtient exactement 3 partameters, c'est la partie [ $# -eq 3 ] . Sinon, alors l' { echo error ; exit 255 ; } { echo error ; exit 255 ; } { echo error ; exit 255 ; } partie sera exécutée. Le code de sortie 255 a une signification spéciale, cela signifie "Etat de sortie hors de scope" voir ici. Je pense que c'est un peu mal appliqué ici, mais possible.

$ # est le nombre d'arguments du shell. Donc, la première ligne dit "exit s'il n'y a pas 3 arguments", parce que la partie droite (après le || ) n'est exécutée que si la partie gauche n'est pas vraie. || est le logique ou .

255 comme un code de return peut être arbitraire.

les scripts returnneront 0 , si le mot "ssortingng" est dans l'input.

est-ce que cela aide?

D'un côté de l'opérateur ou, vous avez la fonction test ([), si celle-ci vaut true (ce qui sera le cas lorsque $ # est égal à trois), nous n'aurons même pas besoin de vérifier l'autre côté. Si c'est faux, nous devons essayer de l'autre côté, qui dans ce cas est une fonction pour faire écho à une erreur, puis quitter. La même fonctionnalité pourrait être accomplie avec un script plus verbeux:

 if [ $# -ne 3 ] then echo error exit 255 fi 

La ligne avec la command grep exit 0 si "string" est dans l'input, sinon le code de sortie sera 1. Une manière plus explicite serait:

 grep -q "ssortingng" if [ $? -eq 0 ] then exit 0 else exit 1 fi