1.03 函数使用return

return与$? #

bash中$?为上一条命令执行后的退出状态,如果是函数则为函数中执行的最后一条命令后的退出状态,但这种退出状态往往不由我们控制,这时return就派上作用了。下面总结了以下几种return使用情况

  • 返回具体数值
    return 20
  • 根据判断返回不同的值
    return $var

return返回的数值会赋值给$?

返回常规值 #

exp1:

#!/bin/bash

# 比较两个数的大小
# 0、为情况1、2设定两个特定值   
# 1、是否有足够的位置参数 输出返回值1
# 2、两个参数值相等 输出返回值2
# 3、参数1大于参数2 输出返回值3
# 4、参数2大于参数1 输出返回值4
# 5、 将1-4使用函数封装
# 6、将函数执行后的返回值赋值给一个变量
# 7、将变量值与设定值作比较,输出结果

E_QUAL=200
E_NUM=201

max ()
{
    if [ -z "$2" ];then
        return $E_NUM
    fi
    if [ "$1" -eq "$2" ];then
        return $E_QUAL
    fi
    if [ "$1" -gt "$2" ];then
        return $1
    else
        return $2
    fi
}

max $1 $2
return_val=$?

if [ "$return_val" -eq "$E_NUM" ];then
    echo "The function max need two args."
elif [ "$return_val" -eq "$E_QUAL" ];then
    echo "The two args are equal."
else
    echo "The bigger args is $return_val."
fi

执行脚本
bash exp3.sh 10 20
输出The bigger args is 20.

上面这个脚本写的太冗余,其实可以优化一下
exp2:

#!/bin/bash

E_QUAL=200
E_NUM=201

max ()
{
    if [ -z "$2" ];then
        result=$E_NUM
    fi
    if [ "$1" -eq "$2" ];then
        result=$E_QUAL
    fi
    if [ "$1" -gt "$2" ];then
        result=$1
    else
        result=$2
    fi
    return $result
}

max $1 $2
return_val=$?

if [ "$return_val" -eq "$E_NUM" ];then
    echo "The function max need two args."
elif [ "$return_val" -eq "$E_QUAL" ];then
    echo "The two args are equal."
else
    echo "The bigger args is $return_val."
fi

返回非常规值 #

在函数里返回值是有范围的,最大为255

#!/bin/bash

return_test ()
{
  return $1 
}

return_test 20
echo $?
return_test 255
echo $?
return_test 256
echo $?
return_test 20000
echo $?

执行输出
27 255 0 32
显然后二出现的值并非预期出现的值

那么如何处理这种情况,返回我们想要的值呢?
bash里可以通过命令替换的方式来实现,具体思路是在函数中将要返回的值通过echo打印到stdout,然后通过命令替换捕获该值
exp1:
cat return_echo.sh

#!/bin/bash

E_ARGS_ERR=100
E_EQUAL=65

max2 () 
{

if [ -z "$2" ]
then
  echo "Usage:The function need two args"
  exit $E_ARGS_ERR
fi

if [ "$1" -eq "$2" ]
then
  result=$E_EQUAL
elif [ "$1" -gt "$2" ]
then
  result=$1
else
  result=$2
fi

echo $result
}

re_val=$(max2 30000 4000)

if [[ "$re_val" -eq "$E_EQUAL" ]]
then
  echo "arg1  is equal arg2"
elif [[ "$re_val" -eq "$E_ARGS_ERR" ]]
then
  echo "args is not enough"
else
  echo "The bigger number is $re_val"
fi

echo

exit 0

上一页➡️

下一页➡️

Calendar Jun 6, 2022
Edit Edit this page
本站总访问量:  次 您是本站第  位访问者