Page 1 sur 3

[RESOLU]script de multiplication sans résultat

Posté : jeu. 23 mars 2017 21:23
par calixtus06
hello je débute les script bash. Je regarde pas mal de vidéo, de tuto écrit ( open class room) et j'avoue , j'ai du mal à décoller..

Image

Où sont mes erreurs et si vous avez des conseils, n'hésitez pas !

merci d'avance

Nico

Re: script de multiplication sans résultat

Posté : jeu. 23 mars 2017 22:57
par WarLocG
Je teste ton script de mon coté(fait)

Voici ma version avec une correction de ton script effectué. En effet, tu testais pas si $2 et $3 existent.

Code : Tout sélectionner

#! /bin/bash
#set -x       # activation du mode trace: permet de voir les erreurs

# if pour tester si arg1 vaut 'multiplication' + arg2 et arg3 non null
if [ $1 = "multiplication" ] && [ ! -z $2 ] && [ ! -z $3 ]; then
  #echo "multiplication"  # echo de test qui n'est plus necessaire

  # alternative qui teste si bc est installe, si oui la commande utilisera bc
  # autrement sera confiee a bash
  if [ ! -z $(which bc) ]; then
    echo "$2 * $3" | bc ;
  else
    echo $(( $2 * $3 )) ;
  fi
fi
L'alternative secondaire est un bonus ;)

En fait, il y a encore un test que j'ai oublié de faire, mais je vais te laisser le trouver ;)

Sinon, la raison pour laquelle j'utilise bc, tu verras qu'en bash tu vas vite être limité. Tu ne peux par exemple pas calculer de nombre a virgule avec.

Code : Tout sélectionner

warlocg@debian-8:~$ echo "2.3 * 4" | bc
9.2
warlocg@debian-8:~$ echo $(( 2.3 * 4 ))
bash: 2.3 * 4  : erreur de syntaxe : opérateur arithmétique non valable (le symbole erroné est ".3 * 4 ")
Résultat:

Code : Tout sélectionner

warlocg@debian-8:~$ sh script_multi.sh multiplication 5.5 6
33.0
warlocg@debian-8:~$ sh script_multi.sh multiplication 6
warlocg@debian-8:~$ 

Re: script de multiplication sans résultat

Posté : sam. 25 mars 2017 16:22
par calixtus06
Merci pour tes conseils ( que je dois encore relire pour comprendre)
Question 1)
Pourquoi un # devant "multiplication" ?

Code : Tout sélectionner

#echo "multiplication"  # echo de test qui n'est plus necessaire
J'ai essayé sans :

Code : Tout sélectionner

#! /bin/bash
set -x
if [ $1 = "multiplication" ] && [ ! -z $2 ] && [ ! -z $3 ]
then
echo "multiplication" 
fi
et dans le terminal ça ne renvoie rien:

Code : Tout sélectionner

nicolasmintkde-desktop Bureau # ./Multiplication.sh multiplication 4 6
nicolasmintkde-desktop Bureau # 
Du coup je remet la phrase en commentaire et ne retrouve pas mon script ( ??)
Normal je dois mal l'enregistrer:

Code : Tout sélectionner

Multiplication.sh
Multiplication.sh.save
Multiplication.sh.save.1
Multiplication.sh.save.1.save
Si tu peux m'aider à y voir plus clair ce serait cool
Pour ta question je pense voir du côté de la commande let. Mais commençons par le début

Re: script de multiplication sans résultat

Posté : sam. 25 mars 2017 23:22
par WarLocG
Salut calixtus06,

le # sert a mettre ce qui suit en commentaire, donc si elle se trouve en debut de ligne, toute la ligne sera commentée, et donc non interpretée par l'interpreteur bash / sh / ksh / csh ... etc

Oui vérifie bien que c'est le bon fichier pour ton script, tu as la commande cat pour afficher ce qui se trouve dans le fichier. Ton script avec le echo réactivé devrait afficher 'multiplication'
calixtus06 a écrit :Pour ta question je pense voir du côté de la commande let. Mais commençons par le début
Tu parles de ceci ?
WarLocG a écrit :En fait, il y a encore un test que j'ai oublié de faire, mais je vais te laisser le trouver
Le test manquant c'est simplement qu'il manque un filtre sur $2 et $3, en effet si je lance

Code : Tout sélectionner

sh mon_script.sh multiplication 3 b
Tu auras une erreur car l'un des deux arguments n'est pas strictement numerique.

Petit exercice supplémentaire quand tu te sentiras pret: if n'est pas la seule instruction pour faire des alternatives, tu as encore les case . Donc l'exercice sera de vraiment coder une calculatrice en bash. L'idée étant de faire un case sur $1. Bon travail :)

Re: script de multiplication sans résultat

Posté : dim. 26 mars 2017 01:31
par calixtus06
oula c'est compliqué pour moi..

oui je répondais à ta remarque
En fait, il y a encore un test que j'ai oublié de faire, mais je vais te laisser le trouver
Qu'est-ce qu'un filtre et un test ? Je vois ce mot test partout sans vraiment comprendre.

Au fait j'ai essayé de refaire la multiplication de façon simple avec la commande read mais je ne parviens pas à comprendre mes erreurs de syntaxe:

Code : Tout sélectionner

#!/bin/bash
#comme sujet d'un premier script je veux créer une commande "multiplication"
#l'utilisateur entre deux nombres entiers  après le mot "multiplication" et cela applique la multiplication de ces deux nombres
echo multiplication
read $1 $2
echo le résultat de la multiplication est '$1*$2'
exit 0
merci encore pour ta patience

Re: script de multiplication sans résultat

Posté : dim. 26 mars 2017 03:24
par alain
Bonjour Calixtux.

Quand WarLocK parle de filtres et de tests, il s'agit de filtrer, tester les entrées.
Par exemple dans ton cas (multiplication) il ne faut pas que tu puisses entrer autres chose que des nombres, sinon (if, case)===> message d'erreur.
ce qui nous amène aux conditions (if).

Bon courage.

Je suis ton sujet, car je n'ai jamais programmé en script bash, j'apprends en même temps :D

Re: script de multiplication sans résultat

Posté : dim. 26 mars 2017 11:47
par calixtus06
Bon je ré essaie

Code : Tout sélectionner

!/bin/bash
#comme sujet d'un premier script je veux créer une commande "multiplication"
#l'utilisateur entre deux nombre même décimaux  après le mot "multiplication" et cela applique la multiplication de ces deux nombres
echo -n  multiplication:
read $1 $2
echo "le résultat de la multiplication est $(($1*$2))"
exit 0
mais on me retourne cette erreur

Code : Tout sélectionner

nicolasmintkde-desktop nicolasmintkde # ./Multiplication3.sh
multiplication:2 3
./Multiplication3.sh: ligne 6: * : erreur de syntaxe : opérande attendue (le symbole erroné est "*")
nicolasmintkde-desktop nicolasmintkde # 
Qu'est ce que j'ai encore fait comme bêtises ?

Re: script de multiplication sans résultat

Posté : dim. 26 mars 2017 12:05
par WarLocG
read fonctionne différemment. Read attend que l'utilisateur rentre une valeur et l'insère dans une variable.

read -p "facteur1 : " f1 #demande une entrée utilisateur dont la valeur sera placée dans une variable $f1
read -p "facteur2 : " f2 #idem pour une nouvelle variable $f2
echo "$f1 * $f2" | bc #évalue valeur dans $f1 * valeur dans $f2

Code : Tout sélectionner

warlocg@debian-8:~$ read -p "facteur1 : " f1
facteur1 : 3
warlocg@debian-8:~$ read -p "facteur2 : " f2
facteur2 : 4
warlocg@debian-8:~$ echo "$f1 * $f2" | bc
12
Les variables $0 à $9 et $?, $#, $@, ... sont un peu propres à bash et ne sont pas à utiliser avec read. Exemple:

Code : Tout sélectionner

#! /bin/bash

echo Nombre d\'arguments $#
echo Liste des arguments $@
echo Commande $0
echo argument1 $1
echo argument2 $2
echo argument3 $3
echo argument4 $4
echo argument5 $5
echo argument6 $6
echo argument7 $7
echo argument8 $8
echo argument9 $9

Code : Tout sélectionner

warlocg@debian-8:~$ bash script_args.sh echo hello le monde --color -vvv
Nombre d'arguments 6
Liste des arguments echo hello le monde --color -vvv
Commande script_args.sh
argument1 echo
argument2 hello
argument3 le
argument4 monde
argument5 --color
argument6 -vvv
argument7
argument8
argument9
Par rapport à ton erreur:
On assigne une variable sans mettre de $
a='blabla'
Et on l'évalue avec le symbole $
echo $a
Dans ton echo tu as basiquement echo "le résultat de la multiplication est $((*))", ce qui retourne une erreur.

Et pour les filtres, alain t'a donné l'explication mais un exemple est plus parlant:

Code : Tout sélectionner

warlocg@debian-8:~$ echo "3 * 4" | bc
12
warlocg@debian-8:~$ echo "3 * b" | bc
0
warlocg@debian-8:~$ echo $(( 3 * 4 ))
12
warlocg@debian-8:~$ echo $(( 3 * b ))
0
warlocg@debian-8:~$ sh script_multi.sh multiplication 2 p
0
Les filtres et les tests c'est des vérifications dans lesquels tu anticipes des erreurs que pourraient faire un utilisateur avec ton script. C'est avec la logique, la base de la programmation :)

Re: script de multiplication sans résultat

Posté : dim. 26 mars 2017 13:54
par calixtus06
J'ai essayé de faire un mini programme avec les syntaxes que tu m'as indiquées:

Code : Tout sélectionner

#! /bin/bash
read -p "facteur1:"f1
read -p "facteur2:"f2
echo $f1*$f2 | bc
ensuite je l'exécute en ligne de commande:

Code : Tout sélectionner

nicolasmintkde-desktop nicolasmintkde # ./Multiplicationread.sh 
facteur1:f1 2
facteur2:f2 3
(standard_in) 1: illegal character: N
(standard_in) 1: syntax error
(standard_in) 1: illegal character: R
(standard_in) 1: illegal character: M
(standard_in) 1: syntax error
(standard_in) 1: illegal character: I
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \250
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: P
(standard_in) 1: illegal character: O
(standard_in) 1: illegal character: L
(standard_in) 1: illegal character: '
(standard_in) 1: illegal character: P
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: W
(standard_in) 1: illegal character: W
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: T
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \251
(standard_in) 1: syntax error
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \251
(standard_in) 1: illegal character: V
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \251
nicolasmintkde-desktop nicolasmintkde # ./Multiplicationread.sh 
facteur1:f12
facteur2:f26
(standard_in) 1: illegal character: N
(standard_in) 1: syntax error
(standard_in) 1: illegal character: R
(standard_in) 1: illegal character: M
(standard_in) 1: syntax error
(standard_in) 1: illegal character: I
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \250
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: P
(standard_in) 1: illegal character: O
(standard_in) 1: illegal character: L
(standard_in) 1: illegal character: '
(standard_in) 1: illegal character: P
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: W
(standard_in) 1: illegal character: W
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: S
(standard_in) 1: illegal character: T
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \251
(standard_in) 1: syntax error
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \251
(standard_in) 1: illegal character: V
(standard_in) 1: illegal character: \303
(standard_in) 1: illegal character: \251
nicolasmintkde-desktop nicolasmintkde # 
Qu'est ce qui se passe ?

Re: script de multiplication sans résultat

Posté : dim. 26 mars 2017 14:02
par calixtus06
Par rapport à ton erreur:
On assigne une variable sans mettre de $
a='blabla'
Et on l'évalue avec le symbole $
echo $a
Dans ton echo tu as basiquement echo "le résultat de la multiplication est $((*))", ce qui retourne une erreur.
Si je comprends bien il aurait fallu écrire:

Code : Tout sélectionner

#!/bin/bash
#comme sujet d'un premier script je veux créer une commande "multiplication"
#l'utilisateur entre deux nombre même décimaux  après le mot "multiplier:" et cela applique la multiplication de ces deux nombres
echo -n "multiplier:"
var=f1
var=f2
read f1 f2
echo "le résultat de la multiplication = $(($f1*$f2))"
exit 0
J'ai réussi !!!