shell函数返回值一般有3种方式:

1、return语句(默认的返回值)

shell函数的返回值可以和其他语言的返回值一样,通过return语句返回。

比如:

#!/bin/bash
function mytest() { echo "mytest function"
echo "argv[1] = $1" if [ $1 = "1" ] ;then
return 1
else
return 0
fi } echo "mytest 1"
mytest 1
echo $? echo "mytest 0"
mytest 0
echo $? if mytest 1 ; then
echo "mytest 1"
fi if mytest 0 ;then
echo "mytest 0"
fi echo "end"

先定义了一个函数,mytest,它根据输入的参数是否为1来return 1,否则return 0。

获取函数的返回值通过调用函数,或者最后执行的值获得。

另外,可以直接用函数的返回值用作if的判断。

注意:return只能用来返回整数值,且和c的区别是返回为正确,其他的值为错误。

2、全局变量或者环境变量

这种就类似于c中的全局变量。

#!/bin/bash

g_var=

function mytest2() {
echo "mytest2"
echo "args $1"
g_var=$1
return 0
} mytest2 1 echo "g_var=$g_var"

函数mytest2通过修改全局变量的值来返回结果。

3、以上两个方法失效的时候

以上介绍的这两种方法在一般情况下都是好使的,但也有例外。

比如:

#!/bin/bash

function mytest3() {
grep "123" test.txt | awk -F: '{print $2}' | while read line ;do
echo "$line"
if [ $line = "yxb" ]; then
return 0
fi
done
echo "mytest3 here "
return 1
} g_var= function mytest4() {
grep "123" test.txt | awk -F: '{print $2}' | while read line ;do
echo "$line"
if [ $line = "yxb" ]; then
g_var=0
echo "g_var=0"
return 0
fi
done
echo "mytest4 here "
return 1
} mytest3
echo $? mytest4
echo "g_var=$g_var"

test.txt中的内容如下:

456:kkk
123:yxb
123:test

输出如下:

yxb@yxb-laptop:~/文档/个人文档/shell函数返回值$ ./no_function.sh
yxb
mytest3 here
1
yxb
g_var=0
mytest4 here
g_var=

可以看到mytest3在return了以后其实没有直接返回,而是执行了循环体后的语句,同时看到mytest4中也是一样,同时,在mytest4中,对全局变量的修改也无济于事,全局变量的值根本就没有改变。

这个是什么原因那?

笔者认为,之所以return语句没有直接返回,是因为return语句是在管道中执行的,管道其实是另一个子进程,而return只是从子进程中返回而已,只是while语句结束了,而函数体之后的语句会继续执行。

同理,全局变量在子进程中进行了修改,但是子进程的修改没有办法反应到父进程中,全局变量只是作为一个环境变量传入子进程,子进程修改自己的环境变量,不会影响到父进程。

因此在写shell函数的时候,用到管道的时候一定要清楚,此刻是从什么地方返回。

4、echo返回值(显式输出)

其实在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。因此不存在上面提到的由于管道导致返回值失效的情况。

在外边只需要获取函数的返回值即可。

#!/bin/bash

function mytest5() {
grep "123" test.txt | awk -F: '{print $2}' | while read line ;do
if [ $line = "yxb" ]; then
echo "0"
return 0
fi
done
return 1
} result=$(mytest5) if [ -z $result ]; then
echo "no yxb. result is empyt"
else
echo "have yxb, result is $result"
fi

输出如下:

have yxb, result is 0

这个方式虽然好使,但是有一点一定要注意,不能向标准输出一些不是结果的东西,比如调试信息,这些信息可以重定向到一个文件中解决,特别要注意的是,用到比如grep这样的命令的时候,一定要记得 1>/dev/null 2>&1 来避免这些命令的输出。

echo输出另一技巧:用函数的返回值作为另外一个函数的参数

#!/bin/bash
Dir=/cygdrive/d/server/ebin
function display() {
files=`ls $Dir`
echo $files
}
echo `display` function filetype() {
echo `file $Dir/$1` #输出待检测文件的类型
} for file in `display` #调用display函数,对其返回值做遍历
do
filetype $file #检测文件类型并输出
done

小总结:

用 $? 来获取函数的 return值,用 $(函数名) 来获取函数的 echo值。

Shell入门教程:Shell函数的返回值的更多相关文章

  1. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  2. 在shell脚本中使用函数的返回值

    #!/bin/bash - function mytest() { echo "arg1 = $1" if [ $1 = "1" ] ;then return ...

  3. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  4. shell获取函数的返回值

    背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的.   定义一个函数 functionname(){      操作内容 ...

  5. shell编程:函数的返回值

    函数的返回值两种形式 return 0-255 0表示成功,1-255表示失败-------通常用于判断 echo 返回一个字符串------------通常用于返回一个执行的结果 return.sh ...

  6. shell 入门教程

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好.     一  惯例,第一个shell #!/bin/bash echo "Hello ...

  7. Linux Bash Shell入门教程

    Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...

  8. GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法

    工作中遇到的问题: 在GDB调试时要进入下边该判断后边的函数,而m_EtherDecode.Chk_MakeSure_IP_Pkt(pPacket,dwPacketLen)的返回值是false,所以需 ...

  9. 关于一些规范:main()函数的返回值 mingw和mingw-w64编译器的区别

    深度剖析c语言main函数---main函数的返回值 - 编程随笔与杂谈 - CSDN博客 https://blog.csdn.net/z_ryan/article/details/80979008 ...

随机推荐

  1. UVA10048 Audiophobia[Floyd变形]

    UVA - 10048 Audiophobia Consider yourself lucky! Consider yourself lucky to be still breathing and h ...

  2. UVA11021 Tribles[离散概率 DP]

    UVA - 11021 Tribles GRAVITATION, n. “The tendency of all bodies to approach one another with a stren ...

  3. 网盘的选择,百度网盘、google drive 还是 Dropbox

    我是国内用户,需要越过Chinawall 我使用的是一枝红杏,用着还行 如果要买,结账时输入'laod80' 一枝红杏官网:官网地址 Dropbox: 稳定,速度快 Dropbox官网:链接 操作十分 ...

  4. AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)

    P4746 C’s problem(c)   时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...

  5. Python黑客编程ARP欺骗

    Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...

  6. IP地址查询接口及调用方法

    1.查询地址 搜狐IP地址查询接口(IP):http://pv.sohu.com/cityjson 1616 IP地址查询接口(IP+地址):http://w.1616.net/chaxun/ipto ...

  7. bash/shell编程学习(1)

    1)定义变量 myvar=abc #注:等号前后不能加空格 #或 myvar="abc" #或 myvar='abc' #注:如果变量后面的值中间本身没有空格,加不加引号都无所谓, ...

  8. 有利于SEO的DIV+CSS的命名规则

    搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前流行的CSS+DIV的命名规则: 页头:header登录条:loginBar标志:logo ...

  9. 怎样让 Web 项目暴露在外的服务坚不可摧?

    Web 项目一般给特定人群使用,有些是局域网用户量不足1K的内部系统,也有些广域网用户上万的中型项目,当然还有用户上亿的大型项目. 这些大大小小的 Web 项目都会有用户登录的存在,登录后有特定的权限 ...

  10. JavaScript类库---JQuery(二)

    接上: 6.Ajax:  一个基础底层函数:jQuery.ajax();  //高级工具函数都会调用此函数:  一个高级工具方法:load() ;  四个高级工具函数:jQuery.getScript ...