Shell Scripting. ERREUR logique

J’ai écrit un script shell avec un boîtier de commutation et accepte les options 1 à 5 et effectue des opérations sur les variables en conséquence.

Mon code fonctionne bien bien qu’il y ait un petit changement que j’aimerais apporter à mon code.

Lorsque le code Entre dans l’argument de casse par défaut, il demande toujours “Entrez deux nombres:”, puis affiche “Option non valide”, ce qui est inapproprié. Le code doit s’arrêter après une option non valide.

Je viens juste d’apprendre les scripts shell donc je ne suis pas doué pour ça.

J’ai copié mon code source ci-dessous:

#! /bin/bash echo "1. Add 2.Substract 3.Divide 4.Multiply 5.Quit" read -p "Enter an option:" option read -p "Enter two numbes: " first second case $option in 1)income=$[ first + second ];; 2)income=$[ first - second ];; 3)income=$[ first / second ];; 4)income=$[ first * second ];; *)echo "Invalid Option"; exit 1;; esac echo "Income=$income" exit 0 

J’ai essayé d’utiliser if, sinon … mais cela ne sert pas le but. * Approche alternative: *

 #! /bin/bash echo "1. Add 2.Substract 3.Divide 4.Multiply 5.Quit" read -p "Enter an option:" option if [ option > 5 ] then echo "Invalid Option" exit 1 else read -p "Enter two numbes: " first second fi case $option in 1)income=$[ first + second ];; 2)income=$[ first - second ];; 3)income=$[ first / second ];; 4)income=$[ first * second ];; *)echo "Invalid Option"; exit 1;; esac echo "Income=$income" exit 0 

Vous devriez regarder la select intégrée, cela aidera à réduire la complexité de ce que vous voulez par beaucoup. Vous pouvez remplacer l’écho / cas par celui-ci.

Dans ce cas, je pense que votre problème est que vous avez vos cas en 1.) plutôt que 1) . Votre utilisateur devra taper le numéro avec la période correspondant à la première.

De plus, vous devez avoir votre ligne de shebang comme #!/bin/bash , cela ne fonctionnera pas avec l’espace que vous avez là.

Lorsque vous avez un menu comme celui-ci, vous pouvez utiliser une boucle à l’infini.

 #! /bin/bash while true do cat <<-EOF 1. Add 2.Substract 3.Divide 4.Multiply 5.Quit EOF read -p "Enter an option:" option read -p "Enter two numbes: " first second case $option in 1) income=$((first + second ));; 2) income=$(( first - second ));; 3) income=$(( first / second ));; 4) income=$(( first * second ));; 5) exit;; *) echo "Invalid Option, try again"; esac echo "Income=$income" done 

Vous n’avez pas besoin d’utiliser si autrement. Il suffit de prendre l’entrée dans le boîtier du commutateur.

 #!/bin/bash echo " 1.Add 2.Subtract 3.Divide 4.Multiply 5.Quit" read -p "Enter an option:" option case $option in 1) read -p "Enter two numbers " first second income=$[ first + second ];; 2) read -p "Enter two numbers " first second income=$[ first - second ];; 3) read -p "Enter two numbers " first second income=$[ first / second ];; 4) read -p "Enter two functions " first second income=$[ first * second ];; *)echo "Invalid Option"; exit 1;; esac echo "Income = $income" exit 0 

Ou vous pouvez utiliser la fonction pour éviter la répétition de l’instruction de lecture.

 #!/bin/bash function GetInput() { read -p "Enter two numbers : " first second } echo " 1.Add 2.Substract 3.Divide 4.Multiply 5.Quit" read -p "Enter an option:" option case $option in 1) GetInput income=$[ first + second ];; 2) GetInput income=$[ first - second ];; 3) GetInput income=$[ first / second ];; 4) GetInput income=$[ first * second ];; *)echo "Invalid Option"; exit 1;; esac echo "Income = $income" exit 0