Forum Clubic

Aide et retours sur mon programme bash

Bonjour,

En suivant un tutoriel je me suis mis au bash. J’essaye de faire une calculatrice qui soit capable d’enchainer plusieurs calculs. Tout retour sur mon code (optimisation, …) est le bienvenu. J’ai deux questions:

  • mon programme tel qu’affiche ci-dessous s’exécute correctement mais m’affiche “trop d’arguments” au niveau de la ligne 29 , au niveau du while. je ne vois pas où est l’erreur, surtout qu’il n’y a qu’un seul argument.

  • j’aimerais ajouter un moyen de quitter proprement ma calculatrice (autrement qu’en cliquant sur la croix en haut à droite du terminal :)), mais je ne vois pas comment faire. Faut il que je crée une variable quitter, qui demande après chaque calcul ?

merci d’avance pour votre aide et vos retours

Bonne journée

Régis

#!/bin/bash

let “a = 1”
let “b = 1”
let “c = 1”
sign=’+’

read -p 'a ? ’ a
read sign
read -p 'b ? ’ b

case $sign in
“+”)
let “c = a + b”
;;
“-”)
let “c = a - b”
;;
“*”)
let “c = a * b”
;;
“/”)
let “c = a / b”
;;

esac
echo $c

while [ -n $sign ]
do

read sign
read -p 'a ? ' a

case $sign in
    "+")
    let "c = c + a"
    ;;
    "-")
    let "c = c - a"
    ;;
    "*")
    let "c = c * a"
    ;;
    "/")
    let "c = c / a"
    ;;

esac

echo $c

done

En gros, ton code actuel c’est ça : pastebin.com…

Voici ce que je trouve à revoir :

pastebin.com…[/url] et son diff [url=http://pastebin.com/diff.php?i=rfEh3DmN]pastebin.com…

  • toujours mettre les chaînes, ou ce qui peut être évalué comme tel, entre ". Cela t’évitera des merdes dans le futur (ex: rm $a n’est pas pareil que rm “$a”, si a=“a b”, alors le premier tente d’effacer a, puis b, et le second tentera d’effacer “a b”)
  • pas besoin de faire un let a = 0, tu peux la déclarer directement via declare. Tu peux aussi dire que c’est une expression numérique (declare -i a=12, cf. www.tldp.org… )
  • j’aime pas mettre les cases sur plusieurs lignes si je peux éviter.
  • tu peux remplacer le while par un until, cf. tldp.org… Cela t’éviterai ton premier bloc (en partie).

merci beaucoup sans-nom pour ton aide.

concernant ta version, comment se passe la sortie du script ? existe il un moyen de quitter le script proprement ? (excepté la croix en haut à droite)

sur le forum Clubic os alternatifs il m’a été suggeré de faire appel à bc , plus complet et plus court au niveau du code (même si mon but était d’apprendre en programmation avec cet exercice). www.clubic.com…

Bonne soirée

Si tu le lances dans un fichier sh, y a pas besoin de quitter. Le code retour par défaut c’est 0, et cela correspond à la fin de script tout bêtement. Par contre, tu dois avoir une boucle “quasi” infinie parce que tu attends sans cesse que l’utilisateur rentre des valeurs.

Tu peux commencer par dire qu’un signe non géré correspond à un arrêt, et faire un exit 0 :

case "$sign" in
  "+") let "c = c + a" ;;
  "-") let "c = c - a" ;;
  "*") let "c = c * a" ;;
  "/") let "c = c / a" ;;
  *) exit 0 ;;
esac

Je ne connais pas bc, mais si ton but est d’apprendre la programmation, tel que tu le dis dans l’autre forum, je ne pense pas que ce soit une bonne idée, ça ou bash. Tu devrais t’orienter vers Java, Python, ou tout simplement le C (j’ai commencé par php, puis le C, puis Java).

Sans être une mauvaise chose, bash t’apprends plutôt la gestion des processus, etc, plus que l’algorithmique (je ne m’aventurerais pas à implémenter une liste doublement chainée ou un simple tri en bash :))

oui je pense commencer par Python. C’est que j’avais un tutoriel qui proposait une initiation à bash et j’ai essayé de faire une calculatrice comme exercice. Oui on en sent vite les limites.

Pour la boucle infinie c’est bien ce qu’il me semblait. d’ailleurs fait appel à bc commeil m’a été suggeré est une bonne idée car bc inclut la commande quit.

la suggestion du exit en cas de signe non egré est bonne.