LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1018|回复: 7

怎么把一个函数的一个返回的数值传递到另外一个函数中的变量?(详见程序)

[复制链接]
发表于 2005-8-8 11:26:55 | 显示全部楼层 |阅读模式
#!/bin/sh
set -x
. $HOME/shell/ch21/isSpaceAvailable

if [ "$#" -lt 2 -o ! -d "$1" ];then
       echo "Usage:[directory][space][units default Kb]"
       exit 1
fi

isSpaceAvailable $1 $2 $3
set +x
//参数1,2,3,分别代表要查询文件的目录,这个目录剩余空间的比较值,和选择比较的单位 可以为mb gb,默认为kb

#!/bin/sh
. $HOME/shell/ch21/getSpaceFree
isSpaceAvailable(){

#if [ "$#" -lt 2 || ! -d "$1" ];then
#        echo "Usage:[directory][space]"
#        exit 1
#fi

spaceavailable=`getSpaceFree $1 $3`
if [ $spaceavailable -lt $2 ];then
        echo "Not enough space!"
        return 1
else
         echo "Have enough space!"
        return 0
fi
}

//调用这个函数查看有多少空间剩余,是否有足够的空间

#!/bin/sh
getSpaceFree(){
default=1024
if [ "$#" -ge 1 ];then
case "$2" in
        [m][mb])space=`df -k "$1" 2>/dev/null | awk ' NR != 1 { print $4; }'`
                space=`echo "$space/$default" | bc`
                ;;
       
        [g][gb])space=`df -k "$1" 2>/dev/null | awk ' NR != 1 { print $4; }'`
                space=`echo "($space/$default)/$default" | bc`
                ;;
        *)space=`df -k "$1" 2>/dev/null | awk ' NR != 1 { print $4; }'`
                space=`echo "$space"`
                ;;
esac
        return $?
fi
return 1
}

//具体的空间比较的实现


现在我的问题就是当调用了getSpaceFree这个函数后,变量space存储了这个空间的值,我却无法把这个值传递个isSpaceAvailable这个函数中的spaceavailable这个变量,以至与不能比较,小生实在有些迷惑,请大家见教,谢谢先.
 楼主| 发表于 2005-8-8 20:13:43 | 显示全部楼层
为什么没有人回应?
回复 支持 反对

使用道具 举报

发表于 2005-8-8 21:23:12 | 显示全部楼层
函数内修改变量的值后是保留的。
你直接在函数里用spaceavailable这个变量即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-9 13:59:49 | 显示全部楼层
但我在函数getSpaceFree()中设置的space这个值是储存住了,但是当我在isSpaceAvailable()这样调用的时候
spaceavailable=`getSpaceFree $1 $3`
if [ $spaceavailable -lt $2 ];then
echo "Not enough space!"
return 1
else
echo "Have enough space!"
return 0
fi

getSpaceFree()中space这个值却没有传递给isSpaceAvailable()这个函数中的spaceavailable这个变量
导致下面的if语句判断的时候,spaceavailable这个值是空的 没有数值.
明白我的意思的吗?
我就是想把getSpaceFree()中space这个值却没有传递给isSpaceAvailable()这个函数中spaceavailable这个变量,然后在用它进行判断.
kiron兄,给点建议吧....
回复 支持 反对

使用道具 举报

发表于 2005-8-9 18:06:37 | 显示全部楼层
Post by foolgenius
但我在函数getSpaceFree()中设置的space这个值是储存住了,但是当我在isSpaceAvailable()这样调用的时候
spaceavailable=`getSpaceFree $1 $3`
if [ $spaceavailable -lt $2 ];then
echo "Not enough space!"
return 1
else
echo "Have enough space!"
return 0
fi

getSpaceFree()中space这个值却没有传递给isSpaceAvailable()这个函数中的spaceavailable这个变量
导致下面的if语句判断的时候,spaceavailable这个值是空的 没有数值.
明白我的意思的吗?
我就是想把getSpaceFree()中space这个值却没有传递给isSpaceAvailable()这个函数中spaceavailable这个变量,然后在用它进行判断.
kiron兄,给点建议吧....
  1. # value=first
  2. # func1()
  3. > {
  4. > value=func1
  5. > }
  6. # func2()
  7. > {
  8. > other=$value
  9. > value=func2
  10. > }
  11. # echo $value
  12. first
  13. # func1
  14. # echo $value
  15. func1
  16. # func2
  17. # echo $value
  18. func2
  19. # echo $other
  20. func1
  21. #
复制代码


我上面说的就是这个意思,你不用local关键字在函数内部定义变量,那么在整个脚本的范围内这个变量都有效,而不仅仅是在这个函数内部。
你可看成它类似于C语言的全局变量
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-10 10:56:34 | 显示全部楼层
那你的意思就是我上面的做法是对的了?
我知道如果不用typeset声明,都被看为全局变量
可是这个程序为什么值就不传递呢?
kiron兄,你试着运行看看,到底为什么?
谢谢
回复 支持 反对

使用道具 举报

发表于 2005-8-10 13:15:32 | 显示全部楼层
Post by foolgenius
那你的意思就是我上面的做法是对的了?
我知道如果不用typeset声明,都被看为全局变量
可是这个程序为什么值就不传递呢?
kiron兄,你试着运行看看,到底为什么?
谢谢


  1. #!/bin/bash


  2. ##########################################################
  3. #                                                        #
  4. #     Program :                                          #
  5. #     Author  : kiron                                    #
  6. #     Date    : 2005-08-10                               #
  7. #     version :                                          #
  8. #                                                        #
  9. ##########################################################

  10. func1()
  11. {
  12.     spaces=hi
  13. }

  14. func2()
  15. {
  16.     spaceavailable=$1
  17.     echo $spaceavailable
  18. }

  19. func1
  20. func2 $spaces
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-12 10:36:18 | 显示全部楼层
已经解决问题了
只要在getSpaceFree函数case结束语句后面
加一句
echo "$space"
让函数返回这个值就可以了
谢谢kiron的关注和帮助
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表