2016-11-25 242 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环境中未在后台执行的管道的最后一个命令。