Как сократить десятичный вывод в bash?

Возможности

Если вы хотите иметь iptablesдоступ к своим контейнерам, вам необходимо включить определенные возможности с помощью переключателя --cap-add=NET_ADMINпри первоначальном запуске контейнера.

Пример

$ docker run --cap-add=NET_ADMIN -it ubuntu:16.04

Затем в контейнере настройте iptablesиsudo:

# apt update -y
# apt-get install iptables sudo -y

Затем внутри контейнера настройте пользователя user1и добавьте его в группу sudo:

# adduser user1
# adduser user1 sudo

Затем установите пользователя наuser1:

# su - user1

Проверьте user1'разрешения sudo:

$ sudo -l
[sudo] password for user1:
Matching Defaults entries for user1 on 1356bf8bd61a:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User user1 may run the following commands on 1356bf8bd61a:
    (ALL : ALL) ALL

Проверьте, могут ли они получить доступ к iptablesчерез sudo:

.

$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Ссылки

0
24.07.2020, 00:05
1 ответ

Попробуйте:

$ ERRORS=1153 TOTAL=43525
$ echo "scale = 3; $ERRORS * 100 / $TOTAL" | bc
2.649

вместо этого. Посмотрите, как в этом случае scale = 3подается на bcдля установки масштабной переменной из bc, которая представляет собой количество цифр, которое оно сохраняет после системы счисления при делении, и как мы сделали умножение на 100 до деления.

Обратите внимание, что это усечение, а не округление. 8 *100 / 9, станет, например, 88,888, а не 88,889.

Если ваша оболочка поддерживает арифметику с плавающей запятой (ksh93, zsh, yash ), вы также можете:

$ printf '%.3f\n' "$((ERRORS * 1e2 / TOTAL))"
2.649

(однако обратите внимание, что в zsh и ksh93 очень важно контролировать содержимое этих переменных, поскольку в противном случае это может привести к уязвимости внедрения команд. Мы используем1e2(число с плавающей запятой 100, а 100— целое число )вместо 100., как в ksh93, 100.не будет работать в локалях, использующих ,в качестве десятичной системы счисления ).

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

$ awk -- 'BEGIN{printf "%.3f\n", ARGV[1] * 100 / ARGV[2]}' "$ERRORS" "$TOTAL"
2.649

Оба из них дадут вам 88,889% (или, возможно, 88 889 в зависимости от региона )для 8 из 9.

4
18.03.2021, 23:17

Теги

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