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

本文探讨了shell脚本中函数调用的返回值和退出状态。通过实验发现,函数中的echo语句如果没有重定向,其输出会成为函数的返回值,而不是直接在屏幕上显示。同时,`return`命令将返回值赋给`$?`变量,而`exit`命令也会影响退出状态。当echo语句有重定向时,返回值不受影响,但输出会被重定向到指定文件。作者提出如何在函数中独立于返回值进行屏幕输出的问题,邀请读者共同讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     最近开始学习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修改如下:

    

 

 

    运行结果如下:

 

    由此可以得出两个结果:

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

 

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

 

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

 

 

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

 

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值