shell调用函数返回值深入分析
编写shell脚本过程中,我们经常会自定义一些函数,并根据函数的返回值不同来执行相应的流程,那么我们如何来获取函数的返回值呢?
首先shell中调用函数有两种方式:
第一种:value=`function_name [arg1 arg2 ......]`
或
第二种:function_name [arg1 arg2 ......]
echo $?
这两种有什么区别呢?
举个例子来说:
[root@zejin240 ~]# cat test.sh
#!/bin/sh
function aaa()
{
if [ "$1" -eq "" ];then
return
elif [ "$1" -eq "" ];then
exit
elif [ "$1" -eq "" ];then
echo ""
echo "" >& #no space after >
echo ""
elif [ "$1" -eq "" ];then
a wrong commend
fi
} echo "begin"
value1=`aaa `
echo $?
echo "value1=$value1"
echo '---------------' value2=`aaa `
echo $?
echo "value2=$value2"
echo '---------------' value3=`aaa `
echo $?
echo "value3=$value3"
echo '---------------' value4=`aaa `
echo $?
echo "value4=$value4" echo "end" 输出如下:
[root@zejin240 ~]# sh test.sh
begin value1=
--------------- value2=
--------------- value3= ---------------
test.sh: line : a: command not found value4=
---------------
end
可以看到,value1 value2 value3 value4的值取决于函数中的标准输出的值,即函数体中的echo内容,注意value3的值,因为我们将31的输出定向到了标准错误输出,而不会出现在value3的值中。
而我们用$?获得的函数执行状态值时,可以看到,没有加return和exit的直接返回它上一条命令执行的状态值,所以echo "32"可以正常返回,所以$?的值为0,而a wrong command 由于不能正常执行,而返回了一个非0的整数。
好了,那么让我们来看下面一个命令:
[root@zejin240 ~]# /opt/lamp/mysql/bin/mysql -h192.168.1. -uDBA -p123 -ss -e 'show variables like "version"'
Warning: Using a password on the command line interface can be insecure.
version 5.6.-log
输出中出现了一个让人有点讨厌的警告,但是呢,当我把命令的值赋与变量aa时
[root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1. -uDBA -p123 -ss -e 'show variables like "version"'`
Warning: Using a password on the command line interface can be insecure.
[root@zejin240 ~]# echo "$aa"
version 5.6.-log
你会发现,变量aa的值并没有包含那个警告信息。为什么呢,看了上面的分析能否知道原因呢
原因是这样子的,虽然在界面显示出来了警告信息,但这个警告信息是被重定向到标准错误输出的,并不会被赋值给变量aa,我是怎么知道的呢
我们可以这样做个实验:
[root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1. -uDBA -p123 -ss -e 'show variables like "version"' >& `
[root@zejin240 ~]# echo "$aa"
Warning: Using a password on the command line interface can be insecure.
version 5.6.-log
我将标准错误输出重定位到标准输入,你看,这变量aa的值就包含警告信息了吧。
当然我们也可以将标准输出重定向到空设备中:
[root@zejin240 ~]# aa=`/opt/lamp/mysql/bin/mysql -h192.168.1. -uDBA -p123 -ss -e 'show variables like "version"' >/dev/null >&`
[root@zejin240 ~]# echo "$aa"
你看,aa的值就为空了吧。(即使是定向到某个文件中输出也为空)
总结:调用函数返回值时,不管方法一还是方法二,echo $?的值是一样的。而方法一中,即value=`function_name [arg1 arg2 ......]`,value的取值取决于调用命令的标准输出,没有标准输出即为空,我们一般用return值来返回函数的最后执行状态,(一般不用exit来返回,因为它直接调用时会直接结束整个shell,当然如果有特殊目的可以这样做),用echo来输出给到变量的值。
shell调用函数返回值深入分析的更多相关文章
- Shell $?获取函数返回值或者上一个命令的退出状态
Shell $?获取函数返回值或者上一个命令的退出状态 来自:互联网 时间:2021-01-12 阅读:2 $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态, ...
- shell中函数返回值
1.前言 快半年没有写博客了,荒废了很久,工作中的杂事太多,自己越来越懒了.为了鞭策自己成长,还是要坚持写写博客,记录自己的成长. 2.shell函数介绍 语法: [ function ] funna ...
- shell的函数返回值
1.默认function的返回值包含0 和1,执行成功,返回0,执行失败,返回1,可以采用$?来获取执行结果 2.函数如何返回字符串呢,可以采用echo函数 #!/bin/bashfunction t ...
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...
- Shell函数返回值、删除函数、在终端调用函数
Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () { list of commands [ return value ] ...
- 【Shell脚本学习22】Shell 函数:Shell函数返回值、删除函数、在终端调用函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...
- shell函数(调用、返回值,返回值获取)
Shell函数返回值,常用的两种方式:return,echo 1) return 语句shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回.示例1: [devadmin@swa ...
- Linux Shell 函数返回值
Shell函数返回值,常用的两种方式:return,echo 1) return 语句 shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回. 示例: #!/bin/sh fu ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
随机推荐
- ffmpeg编译与移植问题
1.下载ffmpeg. 下载网址:http://www.ffmpeg.org/download.html 2.解压缩 tar -zxvf ffmpeg-2.0.1.tar.gz 3.配置,生成Make ...
- Android四大组件--事务详解(转)
一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换成另一种状态. 事务必须服从ISO/IEC所制定的ACID原则. ...
- SQL Server 2016五大优势挖掘企业用户数据价值
SQL Server 2016五大优势挖掘企业用户数据价值 转载自:http://soft.zdnet.com.cn/software_zone/2016/0318/3074442.shtml 3月1 ...
- WiFi流量劫持—— JS脚本缓存投毒
在上一篇<WiFi流量劫持—— 浏览任意页面即可中毒>构思了一个时光机原型,让我们的脚本通过HTTP缓存机制,在未来的某个时刻被执行,因此我们可以实现超大范围的入侵了. 基于此原理,我们用 ...
- 如何在.NET上处理二维码
在移动设备,网站以及应用程序间传送数据,而使用二维码真是一种较快捷的方法,也避免了蓝牙配对的混乱状况.ZXing.NET是一个开源,多格式1D/2D条码图像处理库的C#实现,ZXing.NET是个相当 ...
- DevOps是云计算时代的开发与运营
DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.[1] 它 ...
- Key/Value之王Memcached初探:一、掀起Memcached的盖头来
一.Memcached是何方神圣? 在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的HttpRuntim ...
- 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题
setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...
- [Unity3D]自己动手重制坦克舰队ArmadaTank(2)从碰撞说起
[Unity3D]自己动手重制坦克舰队ArmadaTank(2)从碰撞说起 在上一篇里我给出了重制的坦克舰队效果图和试玩程序.本篇介绍一下玩家坦克和敌方坦克碰撞问题. +BIT祝威+悄悄在此留下版了个 ...
- Christmas Trees, Promises和Event Emitters
今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...