#1 Le 04/05/2026, à 14:04
- fnux

[résolu] Perdu à cause d'une erreur de maths en bash !
Bonjour,
j'ai écrit un petit script pour calculer le temps d'exécution d'un script bash mais je tombe sur un problème incompréhensible:
Dans la version de test [test_time.sh] pour vérifier qu'il fonctionne bien et dans lequel je force les valeurs par défaut pour simuler un temps passé:
#!/bin/sh
# file: test_time.sh
echo ""
echo "-----------------------------------------------------------------------------------------------"
work_date1=$(date)
work_start="0"
#sleep 61
work_date2=$(date)
work_stop="61"
echo ""
work_hour=$(((($work_stop-$work_start))/3600))
work_minutes=$((((($work_stop-$work_start))%3600)/60))
work_secondes=$((((($work_stop-$work_start))%3600)%60))
echo ""
echo "elapsed time: "$work_hour"h "$work_minutes"m $work_secondes""s"
echo ""
echo "I'm done!"
echo ""
echo "-----------------------------------------------------------------------------------------------"et le résultat attendu est bien celui espéré :
fnux@raspberrypi:~/bookworm #
./test_time.sh
-----------------------------------------------------------------------------------------------
elapsed time: 0h 1m 1s
I'm done!
-----------------------------------------------------------------------------------------------Mais si dans le même script renommé [test_time2.sh] j'active la commande [sleep] et je remplace les valeurs par défaut de test par celles obtenues par le script comme ici :
#!/bin/sh
# file: test_time2.sh
echo ""
echo "-----------------------------------------------------------------------------------------------"
work_date1=$(date)
work_start=$SECONDS
sleep 61
work_date2=$(date)
work_stop=$SECONDS
echo ""
work_hour=$(((($work_stop-$work_start))/3600))
work_minutes=$((((($work_stop-$work_start))%3600)/60))
work_secondes=$((((($work_stop-$work_start))%3600)%60))
echo ""
echo "elapsed time: "$work_hour"h "$work_minutes"m $work_secondes""s"
echo ""
echo "I'm done!"
echo ""
echo "-----------------------------------------------------------------------------------------------"alors je reçois le message d'erreur ci-dessous que je ne comprends pas puisque la formule de calcul est strictement identique !
fnux@raspberrypi:~/bookworm #
./test_time2.sh
-----------------------------------------------------------------------------------------------
./test_time2.sh: 10: arithmetic expression: expecting primary: "((-))/3600"Quelqu'un peut-il m'expliquer pourquoi le srcipt "test_time2.sh" ne fonctionne pas alors que le script "test_time.sh" est correct ?
Merci d'avance de votre aide car là, je suis vraiment perdu.
Dernière modification par fnux (Le 04/05/2026, à 22:15)
N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
Hors ligne
#2 Le 04/05/2026, à 14:30
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Bonjour , ç ' est quoi cette variable :
work_start=$SECONDS
?
si c' est une variable systeme ( tres fort probable vu son ecriture ) , je ne vois pas comment ton script peut la récuperer .
d' autre part , tu définis des variables qui ne servent à rien , comme :
work_date1=$(date) # et work_date2=$(date)
Si tu veux que ça fonctionne , il faudrait que tu calcule a partir de $(date) le nombre de secondes , heures , minutes , jours , mois année , pour chaque et faire ensuite une soustraction pour chacune des unités , par exemple .
l ' ideal serait de faire une fonction . ( ça doit déjà exister en plus ) .
Et je vois pas a quoi ça peut bien servir de mettre une variable dans une autre variable dans le cas de :
work_start=$SECONDS
d ' ailleurs , c ' est idem avec tes " work_dateX " .
Dernière modification par iznobe (Le 04/05/2026, à 14:36)
Hors ligne
#3 Le 04/05/2026, à 16:04
- pingouinux

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Bonjour fnux,
Apparemment, la variable SECONDS n'est pas définie en shell. Essaye d'exécuter ton script en bash.
Hors ligne
#4 Le 04/05/2026, à 16:11
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Salut @pingouinux , pourquoi est ce que ça marcherait mieux dans un script en bash qu ' en shell ? si il n ' y a rien qui source cette variable dans le script ???
script bash:
#!/bin/bash
echo "$SECONDS"retour :
iznobe@iznobe-PC-U26:~$ bash Scripts/bash.sh
0
iznobe@iznobe-PC-U26:~$ Dans un script , on peut facilement calculer le nombre de secondes que ça prend entre le début et la fin , par exemple :
#!/bin/bash
Debut=$(date +%s);
sleep 5
echo "le tout en $(($(date +%s)-Debut)) secondes."Si c ' est supérieur a 60 s et que le coeur t ' en dis , tu peux convertir en minutes et s .
pareil pour les heures , si t ' es motivé ![]()
retour :
iznobe@iznobe-PC-U26:~$ bash Scripts/bash.sh
le tout en 5 secondes.
iznobe@iznobe-PC-U26:~$ le tout sans variable superflue .
Dernière modification par iznobe (Le 04/05/2026, à 16:26)
Hors ligne
#5 Le 04/05/2026, à 16:31
- nany

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Bonjour,
Salut @pingouinux , pourquoi est ce que ça marcherait mieux dans un script en bash qu ' en shell ? si il n ' y a rien qui source cette variable dans le script ???
script bash:
#!/bin/bash echo "$SECONDS"retour :
iznobe@iznobe-PC-U26:~$ bash Scripts/bash.sh 0 iznobe@iznobe-PC-U26:~$
0 est bel et bien une valeur. $SECONDS existe donc bien en bash.
Si tu n’es pas convaincu, essaie :
#!/bin/bash
echo "$SECONDS"
sleep 15
echo "$SECONDS"Et tu verras que la variable évolue.
Si c ' est supérieur a 60 s et que le coeur t ' en dis , tu peux convertir en minutes et s .
pareil pour les heures , si t ' es motivé
Bah c’est ce qu’il a fait, non ?
Hors ligne
#6 Le 04/05/2026, à 16:44
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
iznobe@iznobe-PC-U26:~$ cat Scripts/bash.sh && bash Scripts/bash.sh
#!/bin/sh
echo "$SECONDS"
sleep 15
echo "$SECONDS"
15
iznobe@iznobe-PC-U26:~$ heu , oui , ben a ce compte là , c ' est pareil en " sh " .
Hors ligne
#7 Le 04/05/2026, à 16:49
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Au final , je n ' avais pas testé , mais chez moi ça marche sans soucis ton script , si je commente les variables inutiles :
iznobe@iznobe-PC-U26:~$ cat Scripts/bash.sh && bash Scripts/bash.sh
#!/bin/sh
# file: test_time2.sh
echo ""
echo "-----------------------------------------------------------------------------------------------"
#work_date1=$(date)
work_start=$SECONDS
sleep 6
#work_date2=$(date)
work_stop=$SECONDS
echo ""
work_hour=$(((($work_stop-$work_start))/3600))
work_minutes=$((((($work_stop-$work_start))%3600)/60))
work_secondes=$((((($work_stop-$work_start))%3600)%60))
echo ""
echo "elapsed time: "$work_hour"h "$work_minutes"m $work_secondes""s"
echo ""
echo "I'm done!"
echo ""
echo "-----------------------------------------------------------------------------------------------"
-----------------------------------------------------------------------------------------------
elapsed time: 0h 0m 6s
I'm done!
-----------------------------------------------------------------------------------------------
iznobe@iznobe-PC-U26:~$mais pas en "sh " :
iznobe@iznobe-PC-U26:~$ cat Scripts/bash.sh && sh Scripts/bash.sh
#!/bin/sh
# file: test_time2.sh
echo ""
echo "-----------------------------------------------------------------------------------------------"
#work_date1=$(date)
work_start=$SECONDS
sleep 6
#work_date2=$(date)
work_stop=$SECONDS
echo ""
work_hour=$(((($work_stop-$work_start))/3600))
work_minutes=$((((($work_stop-$work_start))%3600)/60))
work_secondes=$((((($work_stop-$work_start))%3600)%60))
echo ""
echo "elapsed time: "$work_hour"h "$work_minutes"m $work_secondes""s"
echo ""
echo "I'm done!"
echo ""
echo "-----------------------------------------------------------------------------------------------"
-----------------------------------------------------------------------------------------------
Scripts/bash.sh: 11: arithmetic expression: expecting primary: "((-))/3600"
iznobe@iznobe-PC-U26:~$ Dernière modification par iznobe (Le 04/05/2026, à 16:51)
Hors ligne
#8 Le 04/05/2026, à 16:50
- nany

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
iznobe@iznobe-PC-U26:~$ cat Scripts/bash.sh && bash Scripts/bash.sh
Ce faisant, tu lances le script en bash.
Essaie :
cat ./Scripts/bash.sh && ./Scripts/bash.shHors ligne
#9 Le 04/05/2026, à 16:59
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
#!/bin/sh
# file: test_time2.sh
echo ""
echo "-----------------------------------------------------------------------------------------------"
#work_date1=$(date)
work_start=$(date +%s);
sleep 61
#work_date2=$(date)
work_stop=$(date +%s)
echo ""
work_hour=$(( (work_stop-work_start) / 3600))
work_minutes=$(( (work_stop-work_start) %3600 / 60))
work_secondes=$(( (work_stop-work_start) %3600 %60))
echo ""
echo "elapsed time: $work_hour h $work_minutes m $work_secondes s"
echo ""
echo "I'm done!"
echo ""
echo "-----------------------------------------------------------------------------------------------"ça , ca marche en bash et en sh .
Mais je n ' en vois pas l' intérêt , vu que 2 lignes suffisent comme déjà dis précédemment au # 4.
Dernière modification par iznobe (Le 04/05/2026, à 17:01)
Hors ligne
#10 Le 04/05/2026, à 17:01
- Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
si /bin/sh n'est pas un lien vers /bin/bash, il renvoie probablement vers un shell plus scrupuleux quant au respect de la norme POSIX (ash, dash, sash...); norme POSIX qui n'implémente pas la variable SECONDS.
d'après le man, bash appelé par sh tente d'honorer autant que possible la norme POSIX. Manifestement, il ne va pas jusqu'à ne pas implémenter certaines variables non-POSIX. ![]()
Edit: heu, je viens de lire le script,
work_secondes=$((((($work_stop-$work_start))%3600)%60))
encore quelques nombres pour faire le calcul, et il y aura plus de parenthèses que de nombres
tiens ! j'ai ça dans mes fonctions :
sec2Jhms ()
{
local arg E j H h M m S s;
test -t 0 && arg=$1 || read arg;
test -n "$arg" || {
>&2 echo "arg required; quitting.";
return 1
};
((arg>0)) || {
>&2 echo "arg must be postive integer; quitting.";
return 1
};
((E=arg, j=E/(24*60**2), H=E%(24*60**2), h=H/(60**2), M=H%(60**2), m=M/(60), s=M%60));
for i in j h m s;
do
(( ${!i}>0)) || unset $i;
done;
echo "${j:+"$j jours "}${h:+"${h}hr "}${m:+"${m}mn "}${s:+"${s}sec"}"
}$ sec2Jhms 1777907646
20577 jours 15hr 14mn 6sec
$ sec2Jhms 1777907640
20577 jours 15hr 14mnDernière modification par Watael (Le 04/05/2026, à 17:19)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 04/05/2026, à 17:05
- nany

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
ça , ca marche en bash et en sh .
Tu lances bien le script en sh et non en bash ?
[edit]OK, tu n’utilises pas la variable $SECONDS.[/edit]
Dernière modification par nany (Le 04/05/2026, à 17:07)
Hors ligne
#12 Le 04/05/2026, à 17:06
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Du coup , pour mon information :
ç ' est quoi cette variable :
work_start=$SECONDS
quelqu ' un sait ? ( hors mis "non-posix" ) ?
une variables système ? une variable interne a bash ? autre chose de pire
?
@nany , oui :
iznobe@iznobe-PC-U26:~$ cat Scripts/bash.sh && sh Scripts/bash.sh
#!/bin/sh
# file: test_time2.sh
echo ""
echo "-----------------------------------------------------------------------------------------------"
#work_date1=$(date)
work_start=$(date +%s);
sleep 61
#work_date2=$(date)
work_stop=$(date +%s)
echo ""
work_hour=$(( (work_stop-work_start) / 3600))
work_minutes=$(( (work_stop-work_start) %3600 / 60))
work_secondes=$(( (work_stop-work_start) %3600 %60))
echo ""
echo "elapsed time: $work_hour h $work_minutes m $work_secondes s"
echo ""
echo "I'm done!"
echo ""
echo "-----------------------------------------------------------------------------------------------"
-----------------------------------------------------------------------------------------------
elapsed time: 0 h 1 m 1 s
I'm done!
-----------------------------------------------------------------------------------------------
iznobe@iznobe-PC-U26:~$Dernière modification par iznobe (Le 04/05/2026, à 17:08)
Hors ligne
#13 Le 04/05/2026, à 17:09
- serged

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
J'ai un petit script qui chronomètre le temps pris par un backuo :
#!/bin/bash
trash-empty
debut=`date +%s`
SAUVE=/media/serge/sauve/backup/
RSYNC="rsync -av --stats --delete-after --force"
$RSYNC --exclude-from=/home/serge/nobak --exclude-from=/home/serge/Vidéos/DVD /home/se$
fin=`date +%s`
let t=$fin-$debut
h=$((t / 3600))
s=$((t % 3600))
m=$((s / 60))
s=$((s % 60))
touch /home/serge/lastbackup
echo Sauvegarde terminée en $h h $m mn $s s
if [ -z $DISPLAY ]
then
echo fini
else
notify-send "Sauvegarde terminée en $h h $m mn $s s"
fiÇa fonctionne !
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#14 Le 04/05/2026, à 17:12
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
[edit]OK, tu n’utilises pas la variable $SECONDS.[/edit]
en fait si , mais je la récupère moi-même en passant par $date vu que sh ne veut pas le faire ![]()
Dernière modification par iznobe (Le 04/05/2026, à 17:13)
Hors ligne
#15 Le 04/05/2026, à 17:16
- nany

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
quelqu ' un sait ? ( hors mis "non-posix" ) ?
une variables système ? une variable interne a bash ? autre chose de pire?
C’est une variable bash.
SECONDS
This variable expands to the number of seconds since the shell was started. Assignment to this variable resets the count to the value assigned, and the expanded value becomes the value assigned plus the number of seconds since the assignment. The number of seconds at shell invocation and the current time are always determined by querying the system clock at one-second resolution. If SECONDS is unset, it loses its special properties, even if it is subsequently reset.
Hors ligne
#16 Le 04/05/2026, à 17:17
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
Merci @nany , donc ba oui , forcément que " sh " ne l' utilise pas alors ![]()
Hors ligne
#17 Le 04/05/2026, à 17:19
- nany

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
nany a écrit :[edit]OK, tu n’utilises pas la variable $SECONDS.[/edit]
en fait si , mais je la récupère moi-même en passant par $date vu que sh ne veut pas le faire
La commande date ne récupère pas la variable $SECONDS de bash.
Hors ligne
#18 Le 04/05/2026, à 17:20
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
non , mais il récupère les secondes de " date " .
il existe une autre variable similaire , je ne sais pas si c ' est compatible " sh " :
$EPOCHSECONDSet aussi
$EPOCHREALTIMEDernière modification par iznobe (Le 04/05/2026, à 17:22)
Hors ligne
#19 Le 04/05/2026, à 17:21
- nany

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
non , mais il récupère les secondes de " date " .
Et c’est différent.
Dernière modification par nany (Le 04/05/2026, à 17:22)
Hors ligne
#20 Le 04/05/2026, à 17:23
- Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
non , mais il récupère les secondes de " date " .
il existe une autre variable similaire , je ne sais pas si c ' est compatible " sh " :
$EPOCHSECONDSet aussi
$EPOCHREALTIME
ces variables ont été introduites dans bash il n'y a pas très longtemps.
Dernière modification par Watael (Le 04/05/2026, à 17:33)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#21 Le 04/05/2026, à 17:26
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
tout dépend . Dans le contexte , le tout est d ' avoir un repère quelconque , donc c ' est différent , mais ça n' a pas d ' importance et ça n' influe pas sur le calcul ( ou je ne vois pas de quelle manière ) , puisqu ' en fait , la demande est en fait une fonction chronomètre " en quelque sorte .
Dans d' autre contexte , sinon oui , il est évident que ça peut ne pas correspondre a ce dont on aura besoin.
Hors ligne
#22 Le 04/05/2026, à 17:41
- Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
"tout dépend" !? « Faut arrêter ces conneries de nord et de sud ! Une fois pour toutes, le nord, suivant comment on est tourné, ça change tout ! » ![]()
on obtient le même résultat en calculant le nombre de secondes depuis EPOCH entre le début et la fin d'un script qu'en affichant simplement le nombre de secondes depuis le début de l'exécution du script avec $SECONDS.
il y a une différence flagrante.
Dernière modification par Watael (Le 04/05/2026, à 17:43)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#23 Le 04/05/2026, à 17:48
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
, oui enfin on parlait de " date " => secondes et $ SECONDS au départ , mais on est d' accord , ici , ça ne change rien .
tant qu ' on a un nombre de secondes au départ et a l' arrivé pour comparer ![]()
on pourrait aussi bien utiliser : $EPOCHSECONDS en bash , que ça ne changerait rien non plus. Et pourtant c ' est bien des choses différentes .
Dernière modification par iznobe (Le 04/05/2026, à 18:05)
Hors ligne
#24 Le 04/05/2026, à 18:25
- Watael

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
avec SECONDS, il n'y a pas à comparer : à la fin (ou au cours) du script, on sait combien de secondes il a duré quand on l'affiche.
date +%s et echo $EPOCHSECONDS indiquent la même chose : le nombre de secondes écoulées depuis EPOCH (1 janv. 1970)
Dernière modification par Watael (Le 04/05/2026, à 18:27)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#25 Le 04/05/2026, à 18:43
- iznobe

Re : [résolu] Perdu à cause d'une erreur de maths en bash !
avec SECONDS, il n'y a pas à comparer : à la fin (ou au cours) du script, on sait combien de secondes il a duré quand on l'affiche.
ce n' est pas moi qui ai écrit ce script . et je ne suis pas l' auteur de la discussion non plus.
On voit bien la comparaison dedans , ne sachant pas ce qu ' était cette variable ( $SECONDS ), je me suis inspiré du script pour faire une comparaison , surtout que j ' avais deja ça dans un autre script.
Du coup je peux gagner une variable et une opération arithmétique , et donc , optimiser encore un peu un autre script ![]()
Hors ligne