TransWikia.com

Formatear variable con el tiempo de respuesta de un servicio a punto decimal con curl

Stack Overflow en español Asked by Fabian Cristancho on August 26, 2021

Soy nuevo en bash, y deseo utilizar el tiempo de respuesta obtenido con el comando curl para realizar diferentes operaciones.

Pero al obtenerlo en una variable, me lo formatea con coma decimal, es decir algo como #,#### pero yo lo necesito con punto decimal #.#### para, por ejemplo realizar una suma. ¿Cómo podría hacerlo?

#!/bin/bash

var=$(curl -o /dev/null -L -qs -w "%{time_total}" www.domain.com)

en este caso var obtiene por ejemplo 0,332342, pero si quiero

x=1.3

y lo sumo con var

result=$(echo "$var + $x" | bc)
echo "$result"

me genera el error

(standard_in) 1: syntax error

Muchas gracias por sus respuestas

2 Answers

curl respeta la configuración regional del usuario, por lo que usa la coma como separador decimal si el sistema así está configurado (por ejemplo, si el sistema tiene la configuración es_ES.UTF-8).

Se me ocurren dos posibles soluciones al problema.

1. Usa una configuración regional que use el punto como separador decimal

La configuracióń regional encargada de la representación de números se establece mediante la variable de entorno LC_NUMERIC. Puedes cambiar temporalmente el entorno de un comando usando env (ejemplo: env VARIABLE='valor' comando) o añadiendo la asignación antes del comando (ejemplo: VARIABLE='valor' comando).

En las configuraciones regionales C y POSIX se usa el punto como separador decimal. Estas configuraciones las encontrarás en todos los sistemas adherentes a la norma POSIX.

Algunos sistemas también ofrecen la configuración C.UTF-8, la cual es similar a las anteriores pero agrega soporte a Unicode mediante la codificación UTF-8.

$ LC_NUMERIC='C' curl -o '/dev/null' -s -w '%{time_total}' 'https://www.example.com/'
0.090306
$ LC_NUMERIC='POSIX' curl -o '/dev/null' -s -w '%{time_total}' 'https://www.example.com/'
0.072698
$ LC_NUMERIC='C.UTF-8' curl -o '/dev/null' -s -w '%{time_total}' 'https://www.example.com/'
0.080962

También puedes usar la configuración regional de un país e idioma que usen el punto como separador decimal, como en_US.UTF-8 o es_MX.UTF-8.

$ LC_NUMERIC='en_US.UTF-8' curl -o '/dev/null' -s -w '%{time_total}' 'https://www.example.com/'
0.074008
$ LC_NUMERIC='es_MX.UTF-8' curl -o '/dev/null' -s -w '%{time_total}' 'https://www.example.com/'
0.078321

2. Reemplaza la coma por el punto

Para esto, puedes usar una expansión de parámetro o sed:

var="$(comando)"
var="${var/,/.}"
var="$(comando)"
var="$(sed 's/,/./' <<< "${var}")"

Correct answer by Fasted Coyote on August 26, 2021

El problema es que la coma se utiliza para el separador decimal

Es necesario comprobar los variables de entorno LC_NUMERIC, LC_ALL, LC_TIME etc.

Por ejemplo:

$ echo 6.25 | LC_ALL= LC_NUMERIC=es_ES.UTF-8 awk --use-lc-numeric '{ print sqrt($1) }'
2,44949
* echo 6.25 | LC_ALL= LC_NUMERIC=en_US.UTF-8 awk --use-lc-numeric '{ print sqrt($1) }'
2.5

Puedes forzar el uso de el punto(".") como el separador con LC_ALL=C.UTF-8:

#!/bin/bash
set -x
URL=....

time_curl() {
    LC_ALL=C.UTF-8 curl    
        --disable          
        --silent           
        --output /dev/null 
        --location         
        --write-out '%{time_total}'  "$1"
}
x=1.3
var=$(time_curl "$URL")
result=$(echo "$var + $x"|bc)
echo "$result"

Answered by andreoss on August 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP