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 ...
随机推荐
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- 在运行Hibernate Hello World程序的时候,抛如下错误: view plain Exception in thread "main" org.hibernate.exception.LockAcquisitionException 解决方法
在运行Hibernate Hello World程序的时候,抛如下错误: Exception in thread "main" org.hibernate.exception.Lo ...
- 学UNITY的基础
先看线性代数教材 再看计算机图形学第三章-几何造型技术 和第五章的法向量高等数学教材 的基础 就没有任何疑问了
- JAVA中如何使用SORT从大到小排
import java.util.Arrays;import java.util.Collections;public class Test { public static void main(Str ...
- PAT 1038. 统计同成绩学生(20)
本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第1行给出不超过105的正整数N,即学生总人数.随后1行给出N名学生的百分制整数成绩,中间以空格分隔.最后1行给出要查 ...
- MongoDB之分片集群与复制集
分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据, ...
- 关于Unity的网络框架
注:Unity 5.1里引入了新的网络框架,未来目标应该是WOW那样的,现在还只是个P2P的架子. 网络的框架,无非是如何管理网络数据的收发,通信双方如何约定协议.之前做的框架与GameObject无 ...
- js兼容获取元素的样式
js获取元素的样式的兼容性处理: function getStyle(obj,attr){ return obj.currentStyle?obj.currentStyle[attr]:getComp ...
- c# 备份数据库恢复数据库
/// <summary> /// 对数据库的备份和恢复操作,Sql语句实现 /// </summary> /// <param name="cmdText&q ...
- codevs 2021 中庸之道
2021 中庸之道 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次 ...