最近开始学习shell脚本,由于之前没怎么接触过linux和shell,所以一切从头开始学起
shell脚本编写方法与编程类似,只是趋向于面向对象编程(个人理解,如果错误,麻烦各位老鸟指出)。其他关于shell脚本到底是怎么样的一个东西大家可以上网查找一下资料。
由于之前写代码,使用的都是C,C++,C#之类的编译型(compiled)语言,所以在接触与学习shell脚本这类脚本(scripting)编程语言的时候,总会不由自主的联想到C,C++,通过类比的方法来学习shell脚本。
最近在一次写shell脚本的时候,遇到一个有趣的事,然后就做了一些小实验,是关于shell脚本中函数调用的返回值,退出状态的问题。
只要写过代码,用过C,C++的人都知道,多数函数都会有一个返回值,用来指出该函数被执行后的结果是什么。
那么shell脚本中,调用一个函数,也能有一个返回值的吧?
然后我就做了如下实验:
创建一个文件ccc,内容如下:
该脚本中包含一个函数Func,功能是在在屏幕上输出字符串abc,然后返回1给变量res,并在屏幕上显示res的值
执行该脚本后,发现,屏幕上只有输出是字符串abc。
奇怪?!那用来接收返回值的变量res去哪里了?如果是空的话,至少也会输出一行字符串abc加一个空行,这样一共有2行。但事实是屏幕上只有输出一行。
接下来,我把脚本ccc中的内容修改了一下:
$?表示的是上一条语句执行后的退出状态,如果是正常退出,则默认值应该为0
但执行脚本后的结果如下:
事实上$?的值为1,而且,字符串abc在1后面被输出,这说明什么?说明调用函数Func的时候根本没有输出abc,屏幕上显示的abc,其实是res的值,即函数Func的返回值!为了验证一下,再次把脚本ccc修改如下:
运行结果如下:
由此可以得出两个结果:
shell脚本中,调用一个函数,如果该函数中有echo语句,而且没有重定向符,那么该函数的返回值就是由所有echo语句所组成的字符串的集合shell脚本中,return命令,是把返回值赋值给$?变量,exit命令也一样(return和exit区别暂时还没发现,如果有哪位高人知道的话烦请指点一二)
那如果被调用函数中有重定向符呢?如果把被调用函数中的所有echo语句,都重定向到一个文件result.txt中,执行脚本后,结果如下:
用于接收函数Func执行结果的变量res为空值。但是退出状态仍然为return命令后面的数值
弄清楚了shell脚本中返回值,退出状态的问题后,那随之而来就产生了一个新的问题:我的初衷是在被调用函数中输出字符串,但现在无法做到在被调用函数中输出,因为所有的echo都打到的函数返回值中去了(或者如果有重定向符,输出到了指定地方去了),那如何在被调用函数中做到在屏幕上输出呢?
这个问题我还没想到办法。如果有谁知道答案的,欢迎留言告诉我一下,或者大家可以一起讨论尝试一下