在shell脚本中减去字符串(即数字)

时间:2012-01-16 01:00:22

标签: bash shell math

我创建了一个shell脚本,用于查找目录的大小,以人类可读的格式返回(例如,802M或702K)。我想计算尺寸之间的差异。

到目前为止,这是我的shell脚本:

#!/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 个答案:

答案 0 :(得分:13)

通过将表达式包装在$(())中,您可以在bash中执行基本的整数数学运算。

$ echo $(( 5 + 8 ))
13

在您的具体情况下,以下内容适用于我:

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

你最后的输出有点奇怪。检查grep表达式是否实际产生了所需的输出。如果没有,您可能需要将正则表达式包装在引号中。

答案 1 :(得分:1)

你不需要调出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手册中的Shell Parameter Expansion

答案 2 :(得分:1)

您只需要:

echo $((${new_remote_dir_size/M/}-${current_remote_dir_size/M/}))
  • $((a + b - 4))可用于算术表达式
  • $ {string / M /}将字符串中的M替换为空。有关更多可能性和详细信息,请参阅man bash,节字符串替换。