[RESOLU]script de multiplication sans résultat
-
- Messages : 172
- Enregistré le : ven. 11 nov. 2016 19:34
- Localisation : Vinay (38)
[RESOLU]script de multiplication sans résultat
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..
Où sont mes erreurs et si vous avez des conseils, n'hésitez pas !
merci d'avance
Nico
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),
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),
Re: script de multiplication sans résultat
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.
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.
Résultat:
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
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 ")
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:~$
-
- Messages : 172
- Enregistré le : ven. 11 nov. 2016 19:34
- Localisation : Vinay (38)
Re: script de multiplication sans résultat
Merci pour tes conseils ( que je dois encore relire pour comprendre)
Question 1)
Pourquoi un # devant "multiplication" ?
J'ai essayé sans :
et dans le terminal ça ne renvoie rien:
Du coup je remet la phrase en commentaire et ne retrouve pas mon script ( ??)
Normal je dois mal l'enregistrer:
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
Question 1)
Pourquoi un # devant "multiplication" ?
Code : Tout sélectionner
#echo "multiplication" # echo de test qui n'est plus necessaire
Code : Tout sélectionner
#! /bin/bash
set -x
if [ $1 = "multiplication" ] && [ ! -z $2 ] && [ ! -z $3 ]
then
echo "multiplication"
fi
Code : Tout sélectionner
nicolasmintkde-desktop Bureau # ./Multiplication.sh multiplication 4 6
nicolasmintkde-desktop Bureau #
Normal je dois mal l'enregistrer:
Code : Tout sélectionner
Multiplication.sh
Multiplication.sh.save
Multiplication.sh.save.1
Multiplication.sh.save.1.save
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),
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),
Re: script de multiplication sans résultat
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'
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
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'
Tu parles de ceci ?calixtus06 a écrit :Pour ta question je pense voir du côté de la commande let. Mais commençons par le début
Le test manquant c'est simplement qu'il manque un filtre sur $2 et $3, en effet si je lanceWarLocG a écrit :En fait, il y a encore un test que j'ai oublié de faire, mais je vais te laisser le trouver
Code : Tout sélectionner
sh mon_script.sh multiplication 3 b
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
-
- Messages : 172
- Enregistré le : ven. 11 nov. 2016 19:34
- Localisation : Vinay (38)
Re: script de multiplication sans résultat
oula c'est compliqué pour moi..
oui je répondais à ta remarque
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:
merci encore pour ta patience
oui je répondais à ta remarque
Qu'est-ce qu'un filtre et un test ? Je vois ce mot test partout sans vraiment comprendre.En fait, il y a encore un test que j'ai oublié de faire, mais je vais te laisser le trouver
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
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),
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),
- alain
- Administrateur du site
- Messages : 14787
- Enregistré le : dim. 11 oct. 2015 23:41
- Localisation : Chelles
- Contact :
Re: script de multiplication sans résultat
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
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
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?
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?
-
- Messages : 172
- Enregistré le : ven. 11 nov. 2016 19:34
- Localisation : Vinay (38)
Re: script de multiplication sans résultat
Bon je ré essaie
mais on me retourne cette erreur
Qu'est ce que j'ai encore fait comme bêtises ?
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
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 #
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),
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),
Re: script de multiplication sans résultat
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
Les variables $0 à $9 et $?, $#, $@, ... sont un peu propres à bash et ne sont pas à utiliser avec read. Exemple:
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:
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
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
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
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
-
- Messages : 172
- Enregistré le : ven. 11 nov. 2016 19:34
- Localisation : Vinay (38)
Re: script de multiplication sans résultat
J'ai essayé de faire un mini programme avec les syntaxes que tu m'as indiquées:
ensuite je l'exécute en ligne de commande:
Qu'est ce qui se passe ?
Code : Tout sélectionner
#! /bin/bash
read -p "facteur1:"f1
read -p "facteur2:"f2
echo $f1*$f2 | bc
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 #
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),
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),
-
- Messages : 172
- Enregistré le : ven. 11 nov. 2016 19:34
- Localisation : Vinay (38)
Re: script de multiplication sans résultat
Si je comprends bien il aurait fallu écrire: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.
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
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),
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),