scripts script resueltos programas paso pasar parametros manejo hacer espaƱol ejercicios ejemplos como comando cadenas bash shell date math timestamp

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