2012-01-16 71 views
5

我做了一個shell腳本來查找一個目錄的大小,並以可讀的格式(例如802M或702K)將其返回。我想計算大小之間的差異。在shell腳本中減去字符串(即數字)

這裏是我的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}" 

但是腳本的輸出就是

- 

我怎樣才能使減法工作?

回答

11

您可以通過在$(())中包裝表達式來完成bash中的基本整數運算。

$ echo $((5 + 8)) 
13 

在特定情況下,我以下工作:

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

你在最後的輸出是一個有點奇怪。檢查grep表達式實際上是否產生所需的輸出。如果沒有,您可能需要將正則表達式換成引號。

+0

嗯,我仍然得到一個錯誤。我將最後一行改爲'echo $(($ {new_size} - $ {current_size}))',但後來出現操作數錯誤。 – 2012-01-16 01:10:17

+0

@mr_schlomo它適用於我的系統。看到我編輯的帖子。確保'grep'確實按照你的預期工作。 – 2012-01-16 01:11:39

+0

哎呀!是的,'grep'是問題所在。我剛剛在我的Linux服務器上運行了我的腳本,它運行正常! – 2012-01-16 01:13:41

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 

Shell Parameter Expansion在bash的手冊。

+0

但是這會默默地減少802k-789M。 :) – 2012-01-16 12:53:47

1

所有你需要的是:

echo $((${new_remote_dir_size/M/}-${current_remote_dir_size/M/})) 
  • $((A + B - 4))可用於算術表達式
  • $ {字符串/ M /}的字符串,沒有任何替代中號。有關更多可能性和細節,請參見man bash,部分字符串替換。
+0

我得到一個替代錯誤與此。 – 2012-01-16 15:33:57

+0

你如何調用它? – 2012-01-16 15:35:20