Shell入门教程:Shell函数的返回值
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函数的返回值的更多相关文章
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- 在shell脚本中使用函数的返回值
#!/bin/bash - function mytest() { echo "arg1 = $1" if [ $1 = "1" ] ;then return ...
- Shell入门教程:Shell函数详解
Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...
- shell获取函数的返回值
背景:定义了一个函数,比对本地和线上服务器集群数量差别,想要获取不同集群的个数.shell和其他语言的函数返回值还是差别挺大的. 定义一个函数 functionname(){ 操作内容 ...
- shell编程:函数的返回值
函数的返回值两种形式 return 0-255 0表示成功,1-255表示失败-------通常用于判断 echo 返回一个字符串------------通常用于返回一个执行的结果 return.sh ...
- shell 入门教程
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. 一 惯例,第一个shell #!/bin/bash echo "Hello ...
- Linux Bash Shell入门教程
Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...
- GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法
工作中遇到的问题: 在GDB调试时要进入下边该判断后边的函数,而m_EtherDecode.Chk_MakeSure_IP_Pkt(pPacket,dwPacketLen)的返回值是false,所以需 ...
- 关于一些规范:main()函数的返回值 mingw和mingw-w64编译器的区别
深度剖析c语言main函数---main函数的返回值 - 编程随笔与杂谈 - CSDN博客 https://blog.csdn.net/z_ryan/article/details/80979008 ...
随机推荐
- JavaScript获取客户端计算机硬件及系统等信息的方法
JavaScript获取客户端计算机硬件及系统等信息的方法 JavaScript 获取客户端计算机硬件及系统信息 通过WMI来实现获取客户端计算机硬件及系统信息: function getSysInf ...
- 用于灰度变换的一些实用的M函数
关于MATLAB中如何对错误处理进行编程,先介绍一些东西: 函数nargin可以检测输入到M函数的参数的数目: 函数nargout可以检测M函数的输出: 函数nargchk能够在M函数体中检测传递的参 ...
- iOS修改TextField占位符颜色大小
UITextField *addCtrolField = [[UITextField alloc]initWithFrame:CGRectMake(CGRectGetMaxX(rightTitleLa ...
- Ubuntu14.04下配置固定IP
实验室需要构建静态网站作为个人知识管理工具,每个人要求都有属于自己的静态网站进行知识积累和交流.但是实验室的路由有时候会关闭,重启后给每台机器重新分配ip,因此为了方便访问每台主机,需要设置静态ip. ...
- BIOS设置和CMOS设置的区别与联系
BIOS是主板上的一块EPROM或EEPROM芯片,里面装有系统的重要信息和设置系统参数的设置程序(BIOS Setup程序): CMOS是主板上的一块可读写的RAM 芯片,里面装的是关于系统配置的具 ...
- StackExchange.Redis 访问封装类
最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...
- JS判断字符串长度的5个方法
这篇文章主要介绍了JS判断字符串长度的5个方法,并且区分中文和英文,需要的朋友可以参考下 目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: 代码如下: String.pr ...
- Elasticssearch学习教程
http://www.cnblogs.com/eggTwo/p/4425269.html
- 点击弹出li所在的序列号
最近在研究一个图片替换功能,及点击左侧商品在右侧弹出层修改图片后,同时左侧的图片也得跟着修改. 我原来考虑的添加ID作为唯一值.但当ID重复了,替换就出BUG了. 最后问公司同事,然后给提供了 根据点 ...
- java基于socket的简单聊天系统
/*=============服务端================*/ /** * 服务器程序 在9999端口监听 * 可以通过控制台输入来回应客户端* @author xiaoluo* @qq 3 ...