bash - programas - scripts linux ejercicios resueltos
Restando dos marcas de tiempo en script bash (3)
Tengo un archivo que contiene un conjunto de marcas de tiempo en formato de H:M:S.MS
, puedo leer e imprimir todas las marcas de tiempo guardadas, pero cuando hago una operación aritmética como Restar (por ejemplo, Timestamp2 - Timestamp1
) no dame la respuesta, no tengo experiencia en la programación de scripts bash.
Cualquier sugerencia, recomendaciones serán muy apreciadas.
Aquí está la captura de pantalla de mi problema.
Aquí hay un ejemplo :
Start Time = 17:53:01.166721
End Time = 17:53:01.369787
El resultado esperado para End Time - Start Time
0:00:0.203066
End Time - Start Time
es 0:00:0.203066
o 0.203066
.
Si desea procesar la fecha usando herramientas simples de línea de comando, necesita convertir las marcas de tiempo en algún formato fácil de tratar, como basado en época.
Puede hacer esto con el comando de date
, que puede ajustar en una función como esta:
timestamp() {
date ''+%s%N'' --date="$1"
}
# timestamp "12:20:45.12345" ==> 1485105645123450000
Entonces puedes restarlos directamente:
echo $(( $(timestamp "${Stime[$i]}") - $(timestamp "${Rtime[$i]}") ))
Tenga en cuenta que, dado que no realiza un seguimiento del día sino solo del tiempo, tendrá errores cuando, por ejemplo, la hora de inicio sea 23:59:59 y la hora de finalización sea 00:00:01.
Si necesita usar bash, debe convertir la marca de tiempo en un valor entero:
$ time="12:34:56.789"
$ IFS=":." read -r h m s ms <<<"$time"
$ echo $h $m $s $ms
12 34 56 789
$ milliseconds=$(( (h*3600 + m*60 + s)*1000 + ms ))
$ echo $milliseconds
45296789
Luego puede restar para obtener un número de milisegundos que representa la diferencia.
Convierta a segundos con algo de aritmética y construcción de cuerdas:
$ seconds="$((milliseconds / 1000)).$((milliseconds % 1000))"
$ echo $seconds
45296.789
Para abordar el punto válido de gniourf_gniourf (de manera torpe):
$ time="12:34:56.7"
$ IFS=":." read -r h m s ms <<<"$time"
$ ms="${ms}000"; ms=${ms:0:3}
$ echo $h $m $s $ms
12 34 56 700
# .......^^^
Además, las cadenas que son números octales no válidos como "08" y "09" arrojarán errores en la aritmética de bash, por lo que explícitamente declaran que son base 10
milliseconds=$(( (10#$h*3600 + 10#$m*60 + 10#$s)*1000 + 10#$ms ))
Suponiendo que sus variables son números enteros, debe adjuntar su cálculo en una evaluación aritmética para que funcione.
echo $(( VAR1 - VAR2 ))
O bien, si desea asignar el valor:
VAR3=$(( VAR1 - VAR2 ))