Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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

tongue

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 wink

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é lol

EDIT : c'est toujours pas bon car 1:0:0 - 0:30:0 vaut 0:30:0 mais pas 1:-30:0 lol

Bref, tu va devoir galerer un peu plus lol

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 wink

Je suis parti vers la 2ème proposition sans arriver à la finaliser tongue (il me manque juste la complétion automatique d'un format m:s par h:m:s. Mais tant pis wink

Et voici le résultat wink

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 wink

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 lol


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 wink

Merci beaucoup!

Hors ligne