Linux Shell函数返回值

2023-11-15

Shell函数返回值,一般有3种方式:returnargvecho


1) return 语句
shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回。
示例:

#!/bin/bash -
function mytest()
{
    echo "arg1 = $1"
    if [ $1 = "1" ] ;then
        return 1
    else
        return 0
    fi
}

echo 
echo "mytest 1"
mytest 1
echo $?         # print return result

echo 
echo "mytest 0"
mytest 0
echo $?         # print return result

echo 
echo "mytest 2"
mytest 2
echo $?         # print return result


echo
echo "mytest 1 = "`mytest 1`
if  mytest 1 ; then
    echo "mytest 1"
fi

echo
echo "mytest 0 = "`mytest 0`
if  mytest 0 ; then
    echo "mytest 0"
fi

echo
echo "if fasle" # if 0 is error
if false; then
    echo "mytest 0"
fi


echo
mytest 1
res=`echo $?`   # get return result
if [ $res = "1" ]; then
    echo "mytest 1"
fi

echo
mytest 0
res=`echo $?`   # get return result
if [ $res = "0" ]; then
    echo "mytest 0"
fi



echo 
echo "end"

结果:

mytest 1
arg1 = 1
1

mytest 0
arg1 = 0
0

mytest 2
arg1 = 2
0

mytest 1 = arg1 = 1
arg1 = 1

mytest 0 = arg1 = 0
arg1 = 0
mytest 0

if fasle

arg1 = 1
mytest 1

arg1 = 0
mytest 0

end

先定义了一个函数mytest,根据它输入的参数是否为1来return 1或者return 0.
获取函数的返回值通过调用函数,或者最后执行的值获得。
另外,可以直接用函数的返回值用作if的判断。
注意:return只能用来返回整数值,且和c的区别是返回为正确,其他的值为错误。


2) argv全局变量

这种就类似于C语言中的全局变量(或环境变量)。

示例:

#!/bin/bash -

g_var=
function mytest2()
{
    echo "mytest2"
    echo "args $1"
    g_var=$1

    return 0
}

mytest2 1
echo "return $?"

echo
echo "g_var=$g_var"

结果:

mytest2
args 1
return 0

g_var=1


函数mytest2通过修改全局变量的值,来返回结果。


注: 以上两个方法失效的时候

以上介绍的这两种方法在一般情况下都是好使的,但也有例外。
示例:
#!/bin/bash -


function mytest3()
{
    grep "123" test.txt | awk -F: '{print $2}' | while read line ;do
        echo "$line"
        if [ $line = "yxb" ]; then
            return 0    # return to pipe only
        fi
    done

    echo "mytest3 here "
    return 1            # return to main process
}

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    # return to pipe only
        fi
    done

    echo "mytest4 here "
    return 1
}

mytest3
echo $?

echo
mytest4
echo $?

echo
echo "g_var=$g_var"

其中,test.txt 文件中的内容如下:

456:kkk
123:yxb
123:test

结果:

yxb
mytest3 here 
1

yxb
g_var=0
mytest4 here 
1

g_var=
可以看到mytest3在return了以后其实没有直接返回,而是执行了循环体后的语句,同时看到mytest4中也是一样,同时,在mytest4中,对全局变量的修改也无济于事,全局变量的值根本就没有改变。这个是什么原因那?
笔者认为,之所以return语句没有直接返回,是因为return语句是在管道中执行的,管道其实是另一个子进程,而return只是从子进程中返回而已,只是while语句结束了。而函数体之后的语句会继续执行。
同理, 全局变量在子进程中进行了修改,但是子进程的修改没有办法反应到父进程中,全局变量只是作为一个环境变量传入子进程,子进程修改自己的环境变量,不会影响到父进程。
因此在写shell函数的时候,用到管道(cmd &后台进程也一样)的时候一定要清楚此刻是从什么地方返回。


3) echo 返回值

其实在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。因此不存在上面提到的由于管道导致返回值失效的情况。
在外边只需要获取函数的返回值即可。

示例:

#!/bin/bash 

##############################################
# Author : IT-Homer
# Date   : 2012-09-06 
# Blog   : http://blog.csdn.net/sunboy_2050
##############################################

function mytest5()
{
    grep "123" test.txt | awk -F: '{print $2}' | while read line; do
        if [ $line = "yxb" ]; then
            echo "0"    # value returned first by this function
            return 0
        fi
    done

    return 1
}

echo '$? = '"$?"
result=$(mytest5)

echo "result = $result"

echo
if [ -z $result ]       # string is null
then
    echo "no yxb. result is empyt"
else
    echo "have yxb, result is $result"
fi
结果:
$? = 0
result = 0

have yxb, result is 0

这个方式虽然好使,但是有一点一定要注意,不能向标准输出一些不是结果的东西,比如调试信息,这些信息可以重定向到一个文件中解决,特别要注意的是,用到比如grep这样的命令的时候,一定要记得1>/dev/null 2>&1来避免这些命令的输出。



参考推荐:

Shell函数返回值

Linux 之 shell 比较运算符(推荐)

Linux Shell学习简单小结(推荐)

SHELL学习笔记----IF条件判断,判断条件


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Shell函数返回值 的相关文章

  • 使用 WGET 运行 cronjob PHP

    我尝试执行一个 cron 并每 5 分钟运行一个 url 我尝试使用 WGET 但我不想下载服务器上的文件 我只想运行它 这是我使用的 crontab 5 wget http www example com cronit php 除了 wg
  • 不同GIT版本的GIT合并结果不同

    在不同的 GIT 版本上运行 merge 命令我们得到不同的结果 命令是 git merge no ff origin master codeline Results 版本2 1 4 gt 合并成功 版本1 7 1 gt 同一提交上的同一合
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • shell 脚本无法将命令行输出保存到变量中

    我正在尝试执行 shell 命令 然后使用 shell 脚本将输出保存到变量中 所以我使用这样的反引号 out ls l print out 该代码工作正常 我可以将它用于任何其他 shell 命令 但是当我尝试执行 python vers
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 如何在 Bash 中将字符串转换为小写

    有办法进去吗bash questions tagged bash将字符串转换为小写字符串 例如 如果我有 a Hi all 我想将其转换为 hi all 有多种方法 POSIX标准 https en m wikipedia org wiki
  • 让“git pull”在拉取不同分支时要求确认

    当同时处理许多项目和分支时 我偶尔会犯一些愚蠢的错误 比如拉入错误的分支 例如在分支上master I did git pull origin dangerous code并且有一段时间没有注意到这一点 这个小错误造成了很大的混乱 当我尝试
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • Bash 中的 Shellshock 漏洞背后的行为是有记录的还是有意为之?

    最近的一个漏洞 CVE 2014 6271 http web nvd nist gov view vuln detail vulnId CVE 2014 6271 如何Bash http en wikipedia org wiki Bash
  • 如何使用类中的常量作为 php 函数中的参数定义?

    我有一堂课 class FetchMode const FetchAll 0 const FetchOne 1 const FetchRow 2 和一个函数 function getRecordSet FetchMode FetchMode
  • 如何在 Bash 中为数组赋值?

    我正在尝试从文本文件中读取值列表 你好 txt 并将它们存储在一个数组中 counter 0 cat hello txt while read line do Unix Array counter line let counter coun
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 在单个命令中使用前缀重命名文件夹中的所有文件

    重命名带有前缀的文件夹中的所有文件 Unix 假设一个文件夹有两个文件 a txt b pdf 那么它们都应该从一个命令重命名为 Unix a txt Unix b pdf 如果您的文件名包含没有空格并且你没有任何子目录 你可以使用一个简单
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers

随机推荐

  • 27条好赚钱副业的途径:自己也能不用上班月入2万+!

    前言 最近我的知乎号也是越做越好了 很多读者私聊我有没有副业可以做 自己平常除本职的工作之外 也会去做一些其他事情 写公众号 搞搞小视频 偶尔还接点小私活 平常还收了几个小徒弟 然而知乎上很多非相关互联网的也给我咨询了好的 不得不说自己还需
  • 基于孪生网络的单目标跟踪持续汇总

    基于Siamese Network的单目标跟踪持续汇总 Visual Object Tracking 从SiamFC开始 涌现了一大批基于孪生神经网络 Siamese Network 的跟踪算法 其中包括多目标跟踪和单目标跟踪 本文将以Si
  • 51单片机用三种方法实现流水灯(超详细)

    51单片机用三种方法实现流水灯 一 数组流水灯 二 移位函数流水灯 三 移位运算符流水灯 一 数组流水灯 定义一组数组分别对应点亮LED1 7 然后利用for循环赋值给p2从而实现流水灯 include
  • 微信用户的 openid 可能会在以下几种情况下发生变化

    微信用户的 openid 可能会在以下几种情况下发生变化 1 用户重新安装微信应用后 会获得一个新的 openid 2 用户在同一设备上切换微信账号后 该设备上存储的 openid 会刷新 3 微信用户设置了 清除缓存 后 也会获得新的 o
  • 项目2-年收入判断

    文章目录 项目2 年收入判断 友情提示 项目描述 数据集介绍 项目要求 数据准备 环境配置 安装 Logistic回归 数据准备 一些有用的函数 梯度与损失 模型训练 绘制损失和精度曲线 预测测试标签 多变量生成模型 数据准备 平均值和协方
  • 概率图模型(PGM):贝叶斯网(Bayesian network)初探

    1 从贝叶斯方法 思想 说起 我对世界的看法随世界变化而随时变化 用一句话概括贝叶斯方法创始人Thomas Bayes的观点就是 任何时候 我对世界总有一个主观的先验判断 但是这个判断会随着世界的真实变化而随机修正 我对世界永远保持开放的态
  • 三层交换机配置OSPF动态路由

    一 建立拓扑图 二 配置主机IP地址 网关 主机号 IP地址 网关 PC 0 192 168 10 101 192 168 10 1 PC 1 192 168 20 101 192 168 20 1 PC 2 192 168 30 101
  • 在IDEA中建好了一个Maven项目后,启动Tomcat,IDEA控制台输出乱码问题的改善

    前言 当我们在IDEA中新建一个Maven项目后 启动Tcomcat访问指定网页时 在IDEA控制台的output窗口会出现中文乱码的情况 对一些人来说 这样看起来很不舒服 为什么会出现这个问题呢 怎样解决这个问题呢 原因 Tomcat的配
  • gorm操作数据库

    gorm官方学习链接 操作总结 func deploy DeploymentConf Get application server instance string error err DB Table DEPLOYTABLENAME Whe
  • ubuntu18.04安装mosquitto及使用

    1 安装 sudo apt add repository ppa mosquitto dev mosquitto ppa sudo apt get update sudo apt get install mosquitto sudo apt
  • Android |双锁单例模式中使用Context如何避免内存泄露的 Warning 提示

    文章目录 问题 解决方法 拓展 问题 在Android开发中 经常会将工具类以单例模式的方法实现 而工具类中又总不可避免的用到 Context 例如 public class MySingleton private static volat
  • 博客积分规则

    博客积分是CSDN对用户努力的认可和奖励 也是衡量博客水平的重要标准 博客等级也将由博客积分唯一决定 积分规则具体如下 1 每发布一篇原创或者翻译文章 可获得10分 2 每发布一篇转载文章 可获得2分 3 博主的文章每被评论一次 可获得1分
  • 软件测试/测试开发

    公众号搜索 TestingStudio 霍格沃兹的干货都很硬核 测试管理平台是贯穿测试整个生命周期的工具集合 它主要解决的是测试过程中团队协作的问题 在整个测试过程中 需要对测试用例 Bug 代码 持续集成等等进行管理 下面分别从这四个方面
  • C/C++编译器配置——MinGW下载安装

    一 前言 由于重装Win11系统 所有配置环境需要重装 对于C C 编译器MinGW配置做一个简单记录 VS code等软件只提供编辑器 不提供编译器 因此windows系统上的C C 编译器需要通过安装MinGW实现 二 安装过程 在Mi
  • 怎么开发企业微信小程序?

    企业微信小程序是一种基于微信平台的小程序 主要用于企业内部管理和沟通 开发企业微信小程序可以帮助企业提高工作效率和协同能力 同时也能够提升企业形象和品牌价值 本文将介绍如何使用小程序制作工具来开发企业微信小程序 一 了解企业微信小程序的优势
  • DevOps系列之 —— 持续开发与集成(五)华为云 DevCloud 代码托管服务及 CloudIDE

    DevOps系列之 DevOps概览 一 软件产业和交付模式发展趋势 DevOps系列之 DevOps概览 二 新型软件技术及交付模式 DevOps系列之 DevOps概览 三 DevCloud HE2E DevOps 框架及其主要服务 D
  • Linux基本指令(ls、pwd、cd、touch、mkdir、rmdir、rm、man、cp、mv、cat、tac、more、less)

    在Linux中文件后缀与文件类型无关 一 ls 功能 对于目录 该命令列出该目录下的所有子目录与文件 对于文件 将列出文件名以及其他信息 1 ls a 列出目录下的所有文件 包括以 开头的隐含文件 目录 ls 与ls a 以 开头是隐藏文件
  • could not create the java virtual machine

    今天早上突然打开不了myeclipse eclipse 每次启动都报错 could not create the java virtual machine 开始以为是java虚拟机出了问题 于是卸了重装还是出现如此问题 接着到网上查找相关资
  • 酒店评论情感分析,亲妈级教程

    酒店评论情感分析 采集与分词篇 开篇吐槽一下下 类似携程这种生活类网站 还有电商类网站 不是驻守被爬的城墙内就是在反爬的道路上行走 不断的更新加密 批量化的采集不断破解并升级程式 并在网络之上布施教程 小白们熬夜拼命的学习 做一个流水线般的
  • Linux Shell函数返回值

    Shell函数返回值 一般有3种方式 return argv echo 1 return 语句 shell函数的返回值 可以和其他语言的返回值一样 通过return语句返回 示例 bin bash function mytest echo