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

Bash 在shell脚本中减去字符串(即数字),bash,shell,math,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

我制作了一个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}"
但是脚本的输出只是

-

如何使减法有效?

您可以在bash中通过将表达式包装在
$(
中来完成基本的整数运算

在您的具体案例中,以下内容对我有效:

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

最后的输出有点奇怪。检查grep表达式是否实际生成所需的输出。如果没有,您可能需要将正则表达式用引号括起来。

您不需要调用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手册中的。

您只需要:

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

嗯,我还是会出错。我将最后一行更改为
echo$(${new_size}-${current_size}))
,但随后我得到一个操作数错误。@mr_schlomo它在我的系统上工作。见我编辑的帖子。确保
grep
实际按照您的预期工作。哎哟!是的,
grep
就是问题所在。我刚刚在Linux服务器上运行了我的脚本,它成功了!您还可以使用以下语法执行算术运算:
echo$[5+8]
并使用变量:
echo$[new\u size+current\u size]
。但这将自动减去802k-789M.)
echo $((${new_remote_dir_size/M/}-${current_remote_dir_size/M/}))