2016-11-25 5 views
1

私のマシンのディスク全体の使用量を取得しようとしています。以下は、スクリプトコードです:サブシェル内のグローバル変数への値の追加が機能していません

#!/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

あなたはサブシェルを実行していますが、終了後に変数が失われる傾向があります。 – Inian

答えて

2

サブシェルの変数totalUsageは、親シェルの値を変更しません。私はman bashから

#!/bin/bash 

後に新しい行として

shopt -s lastpipe 

を挿入することをお勧め

#!/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

[プロセス置換](http://www.tldp.org/LDP/abs/html/process-sub .html)? – Inian

1

:あなたはbashのをタグ付けするので 、あなたのループを修正するためにここに文字列をを使用することができます。

lastpipe:設定され、ジョブ制御がアクティブでない場合、シェルは現在のシェル環境でバックグラウンドで実行されていないパイプラインの最後のコマンドを実行します。

関連する問題