shell脚本中函数调用的返回值,以及退出状态问题

     最近开始学习shell脚本,由于之前没怎么接触过linux和shell,所以一切从头开始学起

 

     shell脚本编写方法与编程类似,只是趋向于面向对象编程(个人理解,如果错误,麻烦各位老鸟指出)。其他关于shell脚本到底是怎么样的一个东西大家可以上网查找一下资料。

 

     由于之前写代码,使用的都是C,C++,C#之类的编译型(compiled)语言,所以在接触与学习shell脚本这类脚本(scripting)编程语言的时候,总会不由自主的联想到C,C++,通过类比的方法来学习shell脚本。

 


 

 

 

     最近在一次写shell脚本的时候,遇到一个有趣的事,然后就做了一些小实验,是关于shell脚本中函数调用的返回值,退出状态的问题。

 

     只要写过代码,用过C,C++的人都知道,多数函数都会有一个返回值,用来指出该函数被执行后的结果是什么。

 

     那么shell脚本中,调用一个函数,也能有一个返回值的吧?

 

 

 

     然后我就做了如下实验:

 

     创建一个文件ccc,内容如下:

 

    shell脚本中函数调用的返回值,以及退出状态问题_第1张图片

 

    该脚本中包含一个函数Func,功能是在在屏幕上输出字符串abc,然后返回1给变量res,并在屏幕上显示res的值

 

    执行该脚本后,发现,屏幕上只有输出是字符串abc。

 

 

 

    奇怪?!那用来接收返回值的变量res去哪里了?如果是空的话,至少也会输出一行字符串abc加一个空行,这样一共有2行。但事实是屏幕上只有输出一行。

 

 

 

    接下来,我把脚本ccc中的内容修改了一下:

 

shell脚本中函数调用的返回值,以及退出状态问题_第2张图片

 

     $?表示的是上一条语句执行后的退出状态,如果是正常退出,则默认值应该为0

 

 

     但执行脚本后的结果如下:

 

 

 

     事实上$?的值为1,而且,字符串abc在1后面被输出,这说明什么?说明调用函数Func的时候根本没有输出abc,屏幕上显示的abc,其实是res的值,即函数Func的返回值!为了验证一下,再次把脚本ccc修改如下:

shell脚本中函数调用的返回值,以及退出状态问题_第3张图片

    

 

 

    运行结果如下:

 

    由此可以得出两个结果:

  1. shell脚本中,调用一个函数,如果该函数中有echo语句,而且没有重定向符,那么该函数的返回值就是由所有echo语句所组成的字符串的集合
  2. shell脚本中,return命令,是把返回值赋值给$?变量,exit命令也一样(return和exit区别暂时还没发现,如果有哪位高人知道的话烦请指点一二)

 

     那如果被调用函数中有重定向符呢?如果把被调用函数中的所有echo语句,都重定向到一个文件result.txt中,执行脚本后,结果如下:

 

     用于接收函数Func执行结果的变量res为空值。但是退出状态仍然为return命令后面的数值

 

 

     弄清楚了shell脚本中返回值,退出状态的问题后,那随之而来就产生了一个新的问题:我的初衷是在被调用函数中输出字符串,但现在无法做到在被调用函数中输出,因为所有的echo都打到的函数返回值中去了(或者如果有重定向符,输出到了指定地方去了),那如何在被调用函数中做到在屏幕上输出呢?

 

 

      这个问题我还没想到办法。如果有谁知道答案的,欢迎留言告诉我一下,或者大家可以一起讨论尝试一下

 

你可能感兴趣的:(shell脚本学习)