【shell编程】函数返回值
shell函数返回值
在 shell 脚本中的函数中有两种方式进行返回值:
return
语句:仅能返回[0, 255]
之间的整数,常用于表示返回函数的执行结果状态。echo
语句:能返回任何数字、任何字符串,常用于表示返回函数的执行结果。
在 shell 脚本函数中可以使用 return
语句返回值,返回值表示的是函数的退出状态码。因为 return
语句的返回值只能是一个 [0, 255
之间的整数,其中 0
表示成功,其他值表示失败。可以在函数调用的后面立马使用特殊变量 $?
虎丘函数的返回值。如例:
#! /bin/bash
# 声明一个函数,该函数的作用是用于计算两数之和
function sum() {
local a=$1
local b=$2
# 返回两数之和的结果
return $((a+b))
}
# 调用函数
sum $1 $2
# 特殊变量 $? 的结果就是函数调用的结果
echo $?
输出:
[root@node01 demo]# sh test.sh 1 2
3
[root@node01 demo]# sh test.sh 2 4
6
2. 例子
#! /bin/bash
test () {
result=1
return $result
}
res=$(test)
echo $res
代码不会输出任何内容,没有输出任何内容的原因是return
命令用于返回函数的退出状态,并不产生输出。$(test)
捕获的是命令的标准输出,而不是它的退出状态。因此,r
的值为空。如果你想捕获函数的输出,你需要使用echo
命令来输出结果。以下是修改后的代码:
#! /bin/bash
test () {
result=1
echo $result
}
res=$(test)
echo $res
在这个代码中,test
函数会将result
的值1
通过echo
输出,然后这个输出会被捕获到变量res
中,最后打印出res
的值,即1
。如果需要检查函数的退出状态(return code),可以这样做:
#! /bin/bash
test () {
result=1
return $result
}
test
echo $?
3. 例子
#!/bin/bash
this_pid=$$
# 判断nginx进程是否正在运行
function is_nginx_running ()
{
ps -ef | grep nginx | grep -v grep | grep -v $this_pid &>/tmp/null
if [ $? -eq 0 ];then
# return 0,也可以省略0直接return,两个是等价
return
else
return 1
fi
}
# return在函数中的返回值,只是用来做状态判断的,根据状态值做下一步判断
# 函数的返回值为0时,表示nginx服务运行正常输出 && 后字符串,否则返回 ||后字符串
is_nginx_running && echo "Nginx is running" || echo "Nginx is stoped"
# 运行脚本
~ % sh 29.echo_return_nginx.sh
Nginx is stoped
~ % sudo nginx # Mac 使用,Linux为 systemctl start nginx
~ % sh 29.echo_return_nginx.sh
Nginx is running
可以通过 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"
输出:
[root@stor01 ~]# ./test.sh
hello world
--------------------------
hello, zhangsan
#!/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"
输出:
[root@stor01 demo]# ./test.sh
当前脚本的绝对路径为:/root/demo/test.sh