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
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.
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
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP