Вычитание строк (которые являются числами) в сценарии оболочки - PullRequest
5 голосов
/ 16 января 2012

Я создал сценарий оболочки, который находит размер каталога и возвращает его в удобочитаемом формате (например, 802M или 702K). Я хочу рассчитать разницу между размерами.

Вот мой сценарий оболочки:

#!/bin/bash

current_remote_dir_size=789M
new_remote_dir_size=802M
new_size=`echo ${new_remote_dir_size} | grep -o [0-9]*`
current_size=`echo ${current_remote_dir_size} | grep -o [0-9]*`

echo "${new_size}-${current_size}"

Но вывод сценария просто

-

Как мне заставить работать вычитание?

Ответы [ 3 ]

13 голосов
/ 16 января 2012

Вы можете сделать базовую целочисленную математику в bash, заключив выражение в $(( и )).

$ echo $(( 5 + 8 ))
13

В вашем конкретном случае для меня работает следующее:

$ echo "${new_size}-${current_size}"
802-789
$ echo $(( ${new_size}-${current_size} ))
13

Ваш вывод в конце немного странный.Убедитесь, что выражение grep действительно выдает желаемый результат.Если нет, вам может понадобиться заключить регулярное выражение в кавычки.

1 голос
/ 16 января 2012

Все, что вам нужно:

echo $((${new_remote_dir_size/M/}-${current_remote_dir_size/M/}))
  • $ ((a + b - 4)) можно использовать для арифметических выражений
  • $ {string / M /} заменяетМ в строке ни с чем.См. man bash, Раздел Подстановка строк, для дополнительных возможностей и деталей.
1 голос
/ 16 января 2012

Вам не нужно вызывать grep для удаления букв из ваших строк:

current_remote_dir_size=789M
current_size=${current_remote_dir_size%[A-Z]}
echo $current_size  # ==> 789

new_remote_dir_size=802M
new_size=${new_remote_dir_size%[A-Z]}
echo $new_size      # ==> 802

См. Расширение параметров оболочки в руководстве по bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...