Управление наборами шифров ssl в Linux

Вы можете использоватьawk:

#! /bin/sh -
x=5678 y=1000
awk -- 'BEGIN{printf "%.3f\n", ARGV[1]/ARGV[2]}' "$x" "$y"

Будете ли вы получать 5.678или 5,678, будет зависеть от локали ($LC_ALL, $LC_NUMERIC, $LANGпеременных )и реализации awk(, некоторые из которых будут использовать .независимо от региона ).

В реализации GNU awkвам необходимо передать переменную POSIXLY_CORRECTв ее окружение, чтобы она учитывала локаль для десятичного символа системы счисления.

Это также относится к входным числам:

$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1,2 10
0,120
$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1.2 10
0,100

(в этом последнем случае 1.2интерпретировалось как 1, потому что при явном преобразовании строки в число (, как при использовании арифметического оператора /здесь ), awkанализирует как можно большую часть строки, если она составляет допустимое число, а остальное игнорирует. Это .2не понимается в этой французской локали, поскольку десятичная система счисления там ,, а не.).

--, чтобы отметить конец опций, необходим в реализации busybox awk, которую вы, кажется, используете, поскольку она принимает опции после аргументов опций, отличных от -, что делает ее не -POSIX. совместимый. Без него вышеуказанное не сработало бы, если бы $xили $yбыли отрицательными числами.

В качестве альтернативы, вы можете снова установить $POSIXLY_CORRECT, что заставит его анализировать свои параметры стандартным способом. Отметим, что в любом случаеbusybox awkвсегда использует .в качестве десятичного символа системы счисления независимо от локали и независимо от $POSIXLY_CORRECT.

0
18.10.2021, 15:44
0 ответов

Теги

Похожие вопросы