#1 Le 25/06/2008, à 16:15
- topblaireau
bash - soustraction de 2 variables h:mm:ss
Bonjour,
Je souhaiterais savoir s'il était possible de soustraire 2 variables horaires h:mm:ss. Voici mon code (c'est un script pour nautilus pour obtenir un extrait dans un fichier vidéo.
#!/bin/bash
for arg
do
debut=`zenity --entry --title="MENCODER" --text="Debut"`#variable debut de type h:mm:ss
fin=`zenity --entry --title="MENCODER" --text="Fin"`#variable fin de type h:mm:ss
file=`zenity --entry --title="MENCODER" --text="Nom du fichier"`
duree=$fin-$debut #ligne à corriger
mencoder "$arg" -ss $debut -endpos $duree -oac copy -ovc copy -o $file
zenity --info --title="MENCODER" --text="Découpage ... OK"
done
Je connais pas grand chose à la programmation... Soustraire 2 variables h:mm:ss doit être particulier lol...
Merci pour votre aide
Dernière modification par topblaireau (Le 25/06/2008, à 16:23)
Hors ligne
#2 Le 25/06/2008, à 18:06
- philpep-tlse
Re : bash - soustraction de 2 variables h:mm:ss
Les variable bash ne sont pas typées...
Regarde cet exemple :
`--> a=1+1
`--> echo $a
1+1
`--> a=$((1+1))
`--> echo $a
2
Donc met plutôt ça :
duree=$(($fin-$debut))
Autre astuce : lance ton script avec
sh -x script.sh
#ou
bash -x script.sh
C'est très utile pour débuger.
Dernière modification par philpep-tlse (Le 25/06/2008, à 18:08)
le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS
Hors ligne
#3 Le 25/06/2008, à 18:43
- topblaireau
Re : bash - soustraction de 2 variables h:mm:ss
merci de te pencher sur mon problème
J'ai omis de préciser que c'était un script pour nautilus que je met dans /home/xxx/.gnome2/nautilus-scripts
Je lance ligne par ligne dans un terminal. Une boîte de dialogue zenity m'invite à entrer les valeurs de mes variables (ici 0:01 et 0:02) et j'obtiens ceci
xxx@xxx:/$ debut=`zenity --entry --title="MENCODER" --text="Debut"`
xxx@xxx:/$ echo $debut
0:01
xxx@xxx:/$ fin=`zenity --entry --title="MENCODER" --text="Fin"`
xxx@xxx:/$ echo $fin
0:02
xxx@xxx:/$ duree=$(($fin-$debut))
bash: 0:02-0:01: erreur de syntaxe dans l'expression (error token is ":02-0:01")
Il faut convertir les 2 variables de type h:mm:ss avant de les soustraire? Ou il y a une astuce?
Dernière modification par topblaireau (Le 25/06/2008, à 18:50)
Hors ligne
#4 Le 25/06/2008, à 18:54
- philpep-tlse
Re : bash - soustraction de 2 variables h:mm:ss
Ok, j'avais pas vu ce petit détail, tu veut une sortie dans le style hh:mm:ss aussi ?
Dans ce cas c'est plus dur, mais pas impossible :
h=$(($(echo $fin | cut -d':' -f1)-$(echo $debut | cut -d':' -f1)))
m=$(($(echo $fin | cut -d':' -f2)-$(echo $debut | cut -d':' -f2)))
s=$(($(echo $fin | cut -d':' -f3)-$(echo $debut | cut -d':' -f3)))
duree=$h:$m:$s
ou si tu ne veut pas créer de nouvelle variable :
duree=$(($(echo $fin | cut -d':' -f1)-$(echo $debut | cut -d':' -f1))):$(($(echo $fin | cut -d':' -f2)-$(echo $debut | cut -d':' -f2))):$(($(echo $fin | cut -d':' -f3)-$(echo $debut | cut -d':' -f3)))
Mais tu perd un peu en lisibilité
EDIT : c'est toujours pas bon car 1:0:0 - 0:30:0 vaut 0:30:0 mais pas 1:-30:0
Bref, tu va devoir galerer un peu plus
Dernière modification par philpep-tlse (Le 25/06/2008, à 19:00)
le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS
Hors ligne
#5 Le 25/06/2008, à 19:09
- topblaireau
Re : bash - soustraction de 2 variables h:mm:ss
Eh ben! quelle rapidité!
Merci beaucoup
Cette méthode marche sous certaines conditions. par exemple si j'essaye de faire 1:00 - 0:59 j'obtiens 1:-59
Je me doutais qu'il fallait prendre en compte les retenues etc. Et il faut aussi forcer le format des variables (si je rentre 0:01 à la place de 0:00:01). Mais ton aide m'est précieuse! J'ai maintenant des éléments pour trouver tout seul (j'espère lol).
Bon ben je vais me replonger dans mes cours d'algorithme (qu'est ce que c'était c***** ça! lol)
Dernière modification par topblaireau (Le 25/06/2008, à 19:12)
Hors ligne
#6 Le 25/06/2008, à 19:17
- Zenigata
Re : bash - soustraction de 2 variables h:mm:ss
Hmm a priori si tu sépares h,m s, passe tout en s, et repasse sous écriture comme il faut, car pour les cas du genre 1:0:0 - 0:30:0, c'est bien le passage en minutes qui permet de "trouver" que ça donne 0:30:0 et non 1:-30:0
--
Z.
Hors ligne
#7 Le 25/06/2008, à 21:50
- philpep-tlse
Re : bash - soustraction de 2 variables h:mm:ss
Hop, écris à chaud, y'a surement moyen de faire plus court...
#!/bin/bash
fin=2:10:0
debut=1:30:5
h=$(($(echo $fin | cut -d':' -f1)-$(echo $debut | cut -d':' -f1)))
m=$(($(echo $fin | cut -d':' -f2)-$(echo $debut | cut -d':' -f2)))
s=$(($(echo $fin | cut -d':' -f3)-$(echo $debut | cut -d':' -f3)))
h=$(($s + 60*$m + 3600*$h))
s=$(($h%60))
let "h -= $s"
m=$(($h/60))
let "h -= $m*60"
duree=$h:$m:$s
echo $duree
Et hop :
`--> ./heures.sh
0:39:55
le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS
Hors ligne
#8 Le 25/06/2008, à 22:54
- topblaireau
Re : bash - soustraction de 2 variables h:mm:ss
J'aurai bien voulu faire comme toi mais il y avait trop d'instructions que je ne connaissais pas comme toi
Je suis parti vers la 2ème proposition sans arriver à la finaliser (il me manque juste la complétion automatique d'un format m:s par h:m:s. Mais tant pis
Et voici le résultat
debut=`zenity --entry --title="MENCODER" --text="Debut (h:m:s)"`
fin=`zenity --entry --title="MENCODER" --text="Fin (h:m:s)"`
debut_en_s=$(($(echo $debut | cut -d':' -f1)*3600+$(echo $debut | cut -d':' -f2)*60+$(echo $debut | cut -d':' -f3)))
fin_en_s=$(($(echo $fin | cut -d':' -f1)*3600+$(echo $fin | cut -d':' -f2)*60+$(echo $fin | cut -d':' -f3)))
duree_en_s=$(($fin_en_s-$debut_en_s))
duree_h=$(($duree_en_s/3600))
duree_m=$((($duree_en_s%3600)/60))
duree_s=$((($duree_en_s%3600)%60))
duree=$duree_h:$duree_m:$duree_s
J'ai convertis en secondes puis reconvertis en h:m:s.
Votre aide m'a été très précieuse
Ce bout de script est utilisé ici
Hors ligne
#9 Le 26/06/2008, à 12:38
- Alain.g
Re : bash - soustraction de 2 variables h:mm:ss
Salut
Pour -endpos de mencoder, on peut parfaitement laisser en seconde. par exemple pour 1:12, on peut mettre -endpos 72
L'opération ci dessus peut se faire également avec awk :
awk -F":" '{print $4*3600+$5*60+$6-$1*3600-$2*60-$3}' <<< "$debut:$fin"
ou encore
awk -F":" '{a=$1*3600+$2*60+$3;b+=a} END {print a*2-b}' <<< $debut$'\n'$fin
En revanche, comme pour la solution de philpep-tlse, cela oblige à mettre complètement h:m:s ; même si le temps est de 24 secondes, il faudrait noter 0:0:24
Pour éviter cela, on pourrait peut-être passer par un fonction de ce style :
#!/bin/bash
_ft () {
read h
t=${h//[0-9]}
if [ -z "$h" ] ; then return 1
elif [ -z "$t" ] ; then echo 0:0:$h
elif [ "$t" = ":" ] ; then echo 0:$h
elif [ "$t" = "::" ] ; then echo $h
else return 1
fi
}
debut=$(zenity --entry --title "MENCODER" --text "Debut" | _ft) || exit 1
fin=$(zenity --entry --title "MENCODER" --text "Fin" | _ft) || exit 1
duree=$(awk -F":" '{print $4*3600+$5*60+$6-$1*3600-$2*60-$3}' <<< "$debut:$fin")
Xubuntu Karmic !
Hors ligne
#10 Le 26/06/2008, à 12:55
- philpep-tlse
Re : bash - soustraction de 2 variables h:mm:ss
rhaa, faut vraiment que je me mette à awk
le "lol" est aux boulets ce que le ";" est aux programmeurs
blog | Wiki Fvwm | Essayez le Window Manager From Scatch | Topic WMFS
Hors ligne
#11 Le 26/06/2008, à 21:17
- topblaireau
Re : bash - soustraction de 2 variables h:mm:ss
que dire Alain.g ...
C'est beau lol. Je capte 1 instruction sur 2 mais ça semble très propre
Merci beaucoup!
Hors ligne