shell 函数返回值接收问题

shell中函数的调用方式有两种,如下图:

第一种方式,有点像C语言调用函数的风格,直接把函数的执行结果复制给变量!不过,这个赋值过程和C语言的函数赋值是不一样的!shell中函数调用的第一种方式,是将标准输出传递给主程序的变量,而不是返回值!

所以请看以下程序:

#!/bin/sh 
 
check_user()
{
    n=`cat /etc/passwd | cut -d ":" -f 1 | grep "^$1$" -Rn | cut -d ":" -f 1`
    echo $n  
    #这里是使用echo语句,将结果输出到标准输出上,所以在主程序中可以使用变量接收
 
}
 
userinfo()
{
    userinfo=`head -$1 /etc/passwd | tail -1 | cut -d ":" -f 3,4`
    echo $userinfo
    
}
 
while true
do
    read username
    m=`check_user $username`
    #使用变量接收函数check_user传递的值
 
    if [ -n "$m" ]
    then
        userinfo $m
        exit
    else
        echo "$username is not exit!"
    fi
done


而函数的第二种调用方式,是使用$?来接收上一程序的返回值状态,也就是return返回的值。

return只能返回数字 下面程序中,if判断后,return 0 或者 1,在这里,我们就可以使用$?接收return的值,然后

存储下来,继而进行下一步的判断!

check_user()
{
    n=`cat /etc/passwd | cut -d ":" -f 1 | grep -n "^$1$"| cut -d ":" -f 1`
    if [ -z "$n" ]
    then
        return 0
    else
        return 1
    fi
}
 
show_userinfo()
{
    userinfo=`head -$n /etc/passwd | tail -1 | cut -d ":" -f 1,3,4`
    echo $userinfo
}
 
echo  "input username : "
read username
 
check_user $username
num=$?
 
if [ $num -eq 0 ]
then
    echo "The user '$username' is not exist."
    exit
else
    show_userinfo $n
fi

上面两个程序的执行结果是一样的,但是要注意着两种函数的不同调用方式,以及其返回给

主调程序的到底是什么。明白了这一点,才能准确知道到底使用何种方式接收返回值!

越界问题

return返回数字有时候正确,有时候又不正确是为什么呢?

我们知道return原本就是用于返回执行状态的,比如0,1.那么我们在返回500的时候,实际上是数据溢出了。

根据测试,我们推断shell的内置return承接返回值用的是一个字节的大小,也就是8位,最多可以输出无符号0-255的整形,范围之外的数据全部溢出显示。因此在使用return的时候,务必留意数值大小。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值