概述
在 Shell 脚本中的函数中有两种方式进行返回值:
return
语句:仅能返回[0, 255]
之间的整数,常用于表示返回函数的执行结果状态。echo
语句:能返回任何数字、任何字符串,常用于表示返回函数的执行结果。
return
语句
在 shell 脚本函数中也可以使用 return
语句返回值,但通常返回值表示的是函数的退出状态码。因为 return
语句的返回值只能是一个 [0, 255
之间的整数,其中 0
表示成功,其他值表示失败。可以在函数调用的后面立马使用特殊变量 $?
虎丘函数的返回值。如例:
#! /bin/bash
# 声明一个函数,该函数的作用是用于计算两数之和
function sum() {
local a=$1
local b=$2
# 返回两数之和的结果
return $(($a+$b))
}
# 调用函数
sum $1 $2
# 特殊变量 $? 的结果就是函数调用的结果
echo $?
但 return
语句进行返回值时的缺点很明显,即只能返回 [0, 255]
之间的任意整数。所以通常我们使用 return
返回语句来判断函数是否执行成功,如返回 0 表示成功,返回 1 表示失败。如例:
#!/bin/bash
function list_files() {
# 校验参数个数是否只有一个,如果不是一个,则返回 1 表示函数执行失败
if [ $# -ne 1 ]; then
echo "参数个数不为 1"
return 1
fi
# 校验输入的参数是否为目录,如果不是则返回 1 表示函数执行失败
if [ ! -d $1 ]; then
echo "输入路径 $1 不是目录"
return 1
fi
# 使用 ls 命令显示输入参数(即目录)下的所有文件
ls "$1"
# 判断 ls 命令的执行结果,如果 ls 命令的返回状态码为 0 表示该命令执行正确,如果不为 0 则表示该命令执行错误
if [ $? -ne 0 ]; then
echo "ls 命令执行失败"
reutrn 1
fi
# 最后返回 0 表示该函数所有操作执行成功
return 0
}
# 调用函数
list_files "/home/"
if [ $? -eq 0 ]; then
echo "函数 list_files 执行成功"
else
echo "函数 list_files 执行失败"
fi
echo
echo "-----------------------------------------"
echo
# 调用函数
list_files "/root/test.txt"
if [ $? -eq 0 ]; then
echo "函数 list_files 执行成功"
else
echo "函数 list_files 执行失败"
fi
如果函数中没有 return
语句,则使用默认的退出状态,即最后一条命令的退出状态码。
echo
语句
可以通过 echo
返回值,通常是返回数据,比如说字符串、在或者不在 [0, 255]
范围内的任意数字等,为了在脚本中的其他地方使用。在函数外通过命令替换 $()
来获取函数的返回结果。如只是使用 echo
返回字符串:
#!/bin/bash
# 声明函数,并返回字符串
function hello() {
echo "hello world"
}
# 调用函数,使用 $() 获取函数的返回值
result=$(hello)
# 打印函数的返回值
echo "$result"
echo
echo "--------------------------"
echo
# 声明函数,并传入参数,并返回字符串
function hello_msg() {
echo "hello, $1"
}
# 调用函数并传入一个参数,使用 $() 获取函数的返回值
result=$(hello_msg "zhangsan")
# 打印函数的返回值
echo "$result"
更复杂的示例如下:
#!/bin/bash
# 声明函数,用来获取 shell 脚本的绝对路径
function get_script_path() {
# 获取脚本文件的父路径
local script_path=$(cd $(dirname $0); pwd)
# 获取脚本名
local script_name=$(basename $0)
# 返回脚本的绝对路径
echo "$script_path/$script_name"
}
# 调用函数,使用命令替换 $() 获取函数的返回值
path=$(get_script_path)
echo "当前脚本的绝对路径为:$path"