Résolu le 29-11-18 [RESOLU]script de multiplication sans résultat

Questions concernant les lignes de commandes
calixtus06
Messages : 172
Enregistré le : ven. 11 nov. 2016 19:34
Localisation : Vinay (38)

[RESOLU]script de multiplication sans résultat

Message 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
Modifié en dernier par calixtus06 le jeu. 30 mars 2017 20:57, modifié 2 fois.
ACER ASPIRE M3641,
KDE Plasma 5.6.5, Distro: Linux Mint 18 Sarah, Intel model: DG41CN, Quad core Intel Core2 Quad Q6600, speed/max: 1596/2394 MHz, NVIDIA G73 [GeForce 7600 GT],
Network Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
Drives: HDD Total Size: 160.0GB (34.1% used)
Memory: 3 go DDR2 Synchrone 667 MHz (1,5 ns)
Kernel: 4.4.0-21-generic x86_64 (64 bit),

Avatar du membre
WarLocG
Messages : 96
Enregistré le : mer. 20 avr. 2016 18:39
Localisation : Belgique

Re: script de multiplication sans résultat

Message 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:~$ 

calixtus06
Messages : 172
Enregistré le : ven. 11 nov. 2016 19:34
Localisation : Vinay (38)

Re: script de multiplication sans résultat

Message 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
ACER ASPIRE M3641,
KDE Plasma 5.6.5, Distro: Linux Mint 18 Sarah, Intel model: DG41CN, Quad core Intel Core2 Quad Q6600, speed/max: 1596/2394 MHz, NVIDIA G73 [GeForce 7600 GT],
Network Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
Drives: HDD Total Size: 160.0GB (34.1% used)
Memory: 3 go DDR2 Synchrone 667 MHz (1,5 ns)
Kernel: 4.4.0-21-generic x86_64 (64 bit),

Avatar du membre
WarLocG
Messages : 96
Enregistré le : mer. 20 avr. 2016 18:39
Localisation : Belgique

Re: script de multiplication sans résultat

Message 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 :)

calixtus06
Messages : 172
Enregistré le : ven. 11 nov. 2016 19:34
Localisation : Vinay (38)

Re: script de multiplication sans résultat

Message 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
ACER ASPIRE M3641,
KDE Plasma 5.6.5, Distro: Linux Mint 18 Sarah, Intel model: DG41CN, Quad core Intel Core2 Quad Q6600, speed/max: 1596/2394 MHz, NVIDIA G73 [GeForce 7600 GT],
Network Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
Drives: HDD Total Size: 160.0GB (34.1% used)
Memory: 3 go DDR2 Synchrone 667 MHz (1,5 ns)
Kernel: 4.4.0-21-generic x86_64 (64 bit),

Avatar du membre
alain
Administrateur du site
Messages : 14704
Enregistré le : dim. 11 oct. 2015 23:41
Localisation : Chelles
Contact :

Re: script de multiplication sans résultat

Message 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
PC are like air conditioning, they becomes useless when you open Windows (L.T)
PC1 : CM : ASRock 990FX | CPU: AMD FX 8350-8 cores, 4 GHz | RAM: 16 Go DDR3 1600 MHz | CG: ATI RX 580-8 Go | OS : LM 20.3 Uma Xfce 4.16 | K: 5.4
PC2
:Core2 Quad Q9650 @ 3 GHz | CG: Nvidia GTX 650TI | OS: LM 21.3 Xfce 4.18| K: 6.5
PC3 :Core i7-2600 @ 3,5 GHz | CG: ATI HD 4650 | OS: Emmade5 Xfce 4.18.0 | K: 6.1
PC4 : AMD Ryzen 5 3500X 4GHz | CG: GTX 970 | Ram : 8GB |OS : Debian 10.5 | K: 5.10
In a world without walls and fences, who needs windows and gates?

calixtus06
Messages : 172
Enregistré le : ven. 11 nov. 2016 19:34
Localisation : Vinay (38)

Re: script de multiplication sans résultat

Message 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 ?
ACER ASPIRE M3641,
KDE Plasma 5.6.5, Distro: Linux Mint 18 Sarah, Intel model: DG41CN, Quad core Intel Core2 Quad Q6600, speed/max: 1596/2394 MHz, NVIDIA G73 [GeForce 7600 GT],
Network Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
Drives: HDD Total Size: 160.0GB (34.1% used)
Memory: 3 go DDR2 Synchrone 667 MHz (1,5 ns)
Kernel: 4.4.0-21-generic x86_64 (64 bit),

Avatar du membre
WarLocG
Messages : 96
Enregistré le : mer. 20 avr. 2016 18:39
Localisation : Belgique

Re: script de multiplication sans résultat

Message 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 :)

calixtus06
Messages : 172
Enregistré le : ven. 11 nov. 2016 19:34
Localisation : Vinay (38)

Re: script de multiplication sans résultat

Message 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 ?
ACER ASPIRE M3641,
KDE Plasma 5.6.5, Distro: Linux Mint 18 Sarah, Intel model: DG41CN, Quad core Intel Core2 Quad Q6600, speed/max: 1596/2394 MHz, NVIDIA G73 [GeForce 7600 GT],
Network Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
Drives: HDD Total Size: 160.0GB (34.1% used)
Memory: 3 go DDR2 Synchrone 667 MHz (1,5 ns)
Kernel: 4.4.0-21-generic x86_64 (64 bit),

calixtus06
Messages : 172
Enregistré le : ven. 11 nov. 2016 19:34
Localisation : Vinay (38)

Re: script de multiplication sans résultat

Message 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 !!!
ACER ASPIRE M3641,
KDE Plasma 5.6.5, Distro: Linux Mint 18 Sarah, Intel model: DG41CN, Quad core Intel Core2 Quad Q6600, speed/max: 1596/2394 MHz, NVIDIA G73 [GeForce 7600 GT],
Network Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
Drives: HDD Total Size: 160.0GB (34.1% used)
Memory: 3 go DDR2 Synchrone 667 MHz (1,5 ns)
Kernel: 4.4.0-21-generic x86_64 (64 bit),

Répondre