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. java线程池(newSingleThreadExecutor())小应用

    创建单个线程,用来操作一个无界的队列任务,不会使用额外的线程.如果线程崩溃会重新创建一个,直到任务完成. 代码: import java.util.concurrent.ExecutorService ...

  2. .Net 闭包理解

    .Net 闭包理解 这个东西初看是比较难懂,但是一旦理解之后就很容易了,做笔记以加深印象.且看这题 example.1 class Program { static void Main(string[ ...

  3. 使用TaskManager爬取2万条代理IP实现自动投票功能

    话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给XX投票,以前呢会很自觉打开链接帮忙投一票.可是这种事做多了就会考虑能不能使用工具来进行投票呢,身为一名程序猿决定研究解决这个问题. ...

  4. web前端开发最佳实践笔记

    一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...

  5. jquery easy ui datagrid中遇到的坑爹的問題。。。

    ; //修改 function Update() { //獲取選中行 var selected = $("#dg1").datagrid('getSelected'); //判斷是 ...

  6. .NET 常用框架

    1.Hangfire 2.Lucene.Net 3.Log4Net 4.Quartz.Net 5.Autofac 6.SqlSugar 7.NPOI 8.Senparc.Weixin.MP 9.Aut ...

  7. ionic 开发笔记

    1.AngularJS 外部的控制器(DOM 事件.外部的回调函数如 jQuery UI 空间等)调用了 AngularJS 函数之后,必须调用$apply.在这种情况下,你需要命令 AngularJ ...

  8. Redis JedisPool

    获取连接池,通常连接池为单例,这里使用 双端检测机制保证只有一个实例 public class JedisPoolUtil { private static volatile JedisPool je ...

  9. [Think In Java]基础拾遗2 - 多态、反射、异常、字符串

    目录 第八章 多态第十四章 类型信息第十二章 通过异常处理错误第十三章 字符串 第八章 多态 1. 前期绑定 & 后期绑定 绑定是指将方法调用同一个方法主体关联起来的这么一个过程.如果在程序执 ...

  10. Flash调用麦克风

    import flash.events.ActivityEvent;import flash.media.Microphone;var deviceArray:Array = Microphone.n ...