Bonsoir tout le monde ,
J'ai le script suivant que j'ai nommé fibon.sh
#!/bin/sh
if [$1 -eq 0] || [$1 -eq 1 ];
then
echo 1
else
n=$1
fib1='bash ./fibo.sh $(($n-1))'
fib2='bash ./fibo.sh $(($n-2))'
echo $(($fib1 + $fib2))
fi
ensuite je suis allé sur shell , j'ai ajouté fibon.sh aux bins ( pour qu'il puisse etre reconnu et exécuté) et quand je tape ensuite sur le terminal par exemple fibon.sh 4 voici ce que j'obtiens :
/home/F/Bureau/fibo/fibon.sh: 2: /home/mn/Bureau/fibo/fibon.sh: [4: not found
/home/F/Bureau/fibo/fibon.sh: 2: /home/mn/Bureau/fibo/fibon.sh: [4: not found
/home/F/Bureau/fibo/fibon.sh: 9: /home/mn/Bureau/fibo/fibon.sh: arithmetic expression: expecting EOF: "bash ./fibo.sh $(($n-1)) + bash ./fibo.sh $(($n-2))"
SVP aidez moi :/ :/ :/
# Bashism
Posté par Tonton Benoit . Évalué à 4.
Déjà les espaces après les
[
sont importants en shell, sinon il va chercher à exécuter le programme[4
et évaluer le résultat avec le if.Donc :
if [ $1 -eq 0 ] || [ $1 -eq 1 ]
Ensuite pour exécuter un sous-shell c’est pas
'commande'
qu'il faut utiliser , mais`commande`
ou$(commande)
[^] # Re: Bashism
Posté par Benoît Sibaud (site web personnel) . Évalué à 6.
Shellcheck, en ligne ou localement, peut aider pour détecter ce genre de soucis.
[^] # Re: Bashism
Posté par Xavier . Évalué à 2.
bash -n peut aider pour la syntaxe et ./lenomduscript rends dépendant son exécution à où il se trouve sur le filesystem.
# simplifions tout ca
Posté par NeoX . Évalué à 4. Dernière modification le 08 octobre 2015 à 13:42.
$0 rappelle la commande que tu viens de lancer donc fibo.sh
[^] # Re: simplifions tout ca
Posté par mac_is_mac (site web personnel) . Évalué à 3.
Le concept de fonction existe en bash.
Pourquoi repasser par une instance de bash ?
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-8.html
[^] # Re: simplifions tout ca
Posté par totof2000 . Évalué à 4.
Cesse de lui faire ses devoirs, sinon ils vont tous rappliquer ici …
# Efficacité
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3.
Au passage, ton programme, là, c'est l'exemple typique d'implémentation hautement inefficace de la suite de Fibonacci : chaque appel du programme déclenche deux autres appels, ce qui fait qu'il a, en temps de calcul comme en consommation mémoire, un coût qui varie en fonction exponentielle du numéro du terme que tu veux calculer.
La bonne façon de faire consiste à trouver un moyen de mémoriser les termes déjà calculés, de façon à éviter de les recalculer ; on peut ainsi arriver à écrire un programme dont le coût est proportionnel au numéro du terme à calculer. Mais je doute que ce soit possible par appels successifs d'un programme.
[^] # Re: Efficacité
Posté par delio . Évalué à 1. Dernière modification le 09 octobre 2015 à 14:49.
Le temps de calcul est exponentiel mais la conso mémoire est quand même linéaire avec l'algo récursif (la taille max de la pile d'appel pendant le calcul de fib(n) est n)
[^] # Re: Efficacité
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 3.
Ah oui, au temps pour moi, ça ne parallélise pas les appels.
[^] # Re: Efficacité
Posté par Michaël (site web personnel) . Évalué à 2.
Ce n'est pas très facile de paralléliser des appels récursifs! :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.