2016-11-25 60 views
1

我正在嘗試獲取我的計算機的總磁盤使用情況。下面是腳本代碼:在子shell中向全局變量添加值不起作用

#!/bin/sh 
totalUsage=0 
diskUse(){ 
    df -H | grep -vE '^Filesystem|cdrom' | awk '{ print $5 " " $1 }' | while read output; 
    do 
     diskUsage=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
     totalUsage=$((totalUsage+diskUsage)) 
    done 
} 
diskUse 
echo $totalUsage 

雖然totalUsage是一個全局變量,我曾試圖單獨的磁盤使用情況和爲totalUsage在該行:

totalUsage=$((totalUsage+diskUsage))

totalUsagedo之間的回聲和done顯示正確的值, 但當我嘗試在呼叫diskUse後回顯它時,它仍然打印0

你能幫我嗎,這裏有什麼不對?

+2

您正在運行一個子shell,變量在其退出後傾向於丟失 – Inian

回答

2

子shell中的變量totalUsage不會更改父shell中的值。 既然你標記bash中,你可以使用這裏串來修改你的循環:

#!/bin/bash 
totalUsage=0 
diskUse(){ 
    while read output; 
    do 
     diskUsage=$(echo $output | awk '{ print $1}' | cut -d'%' -f1) 
     totalUsage=$((totalUsage+diskUsage)) 
    done <<<"$(df -H | grep -vE '^Filesystem|cdrom' | awk '{ print $5 " " $1 }')" 
} 
diskUse 
echo $totalUsage 
+0

爲什麼不[process-substitution](http://www.tldp.org/LDP/abs/html/process-sub .html)? – Inian

1

我建議以後

#!/bin/bash 

man bash插入

shopt -s lastpipe 

爲新行:

lastpipe:如果設置,並且作業控制未激活,則shell將運行當前shell環境中未在後臺執行的管道的最後一個命令。