[ Content contribution] 给 Bash 函数添加 返回值
Tofloor
poster avatar
149*********12
deepin
2024-04-27 10:17
Author

原文:https://itsfoss.com/bash-function-return-value/

csdn 同步: http://t.csdnimg.cn/fGXme

与其他编程语言不同,Bash 中的函数不返回任何值。相反,它返回退出状态或一个数字值(介于 1 和 255 之间),表示执行的成功或失败。

但问题在于如何让 Bash 函数返回值。

当然,如果我写这个教程,我必须有一个解决方案(或者说变通方法)来解决这个问题,但在此之前,让我们首先了解问题。

我们正在处理的问题 首先,让我分享一个简单的 C 程序,来解释编程语言如何通过 bash 函数返回值:

​
// Function declaration with return type int
int add(int x, int y) {
    return x + y;
}
​
int main() {
    // Call the function and store the result in a variable
    int result = add(3, 4);
​
    // Print the result
    printf("%d\n", result);
​
    return 0;
}

**如果你运行上面的 C 程序,它会返回 **7 ,如下所示:

How functions in C programs returns value

**在上面的 C 程序中,我创建了一个名为 **add 的函数,它接受两个值,并使用 return 语句来相加这两个值。

不幸的是,bash 中的函数不是这样工作的,它们给出的是函数中使用的最后一个命令的退出状态,退出状态可以是 0(成功)或非零(失败)。

**在 bash 中有一个特殊的变量 **$? 用于获取退出状态。所以让我快速分享一下你可以如何使用它:

#!/bin/bash
​
# Defining the function
function test {
  echo "A demo function created to check the exit status"
}
​
# Calling function
test
​
# Checking the status
echo "The exit status of the test is: $?"

Check the exit status in bash

**正如你所见,它返回 **0 表示函数已成功执行!

现在,让我们看看如何使 bash 函数返回值。

如何使 bash 函数返回一个值

有两种方法可以使 bash 函数返回一个值:

  • 使用标准输出数据流(涉及使用 echo 或 print 命令)
  • ** 使用全局变量**

当然,这与在 C 或其他编程语言中返回值不同,但在许多情况下可能会对您有所帮助。

所以让我们从第一个开始。

方法 1:使用标准输出数据流

如果你不了解数据流,Linux 中有 3 种数据流:输入、输出和错误。每个都用于不同的任务。

如标题所示,在这种方法中我将使用 echo 或 printf 命令来使用标准输出数据流。

仍然感到困惑吗?简单来说,我将把函数的输出发送到标准输出数据流以打印输出(这就是 printf 或 echo 命令的用法所在)。

首先,让我分享一个 Bash 脚本:

#!/bin/bash
​
# Function definition
function demo {
  local namaste="Greetings from Bash!"
  echo "${namaste}"
}
​
# Call the function and capture its output
output=$(demo)
​
# Print the captured output
echo "${output}"  

当执行时,它将给出以下输出:

Use the standard output data stream to make the bash function return value

现在,让我们看看解释部分。

**首先,我创建了一个函数 **demo ,其中有一个局部变量 namaste ,其中包含我想要打印的字符串。

**后来,我使用 echo 命令打印了 **namaste 变量内的数据。

**在接下来的部分中,我调用了 **$() 概念内的函数,该函数将在子 shell 中执行 demo 函数,并且输出被 output 变量捕获。

**最后,echo 命令被用来打印 **ouptut 变量的捕获输出。

** 相当容易。对吧?**

方法 2:使用全局变量

**默认情况下,bash 中的每个变量都是全局的,要使用局部变量,必须在分配任何值之前使用术语 **local

但问题是如何在 bash 函数中使用全局变量返回值。好吧,让我展示一个简单的 bash 脚本,用于此目的使用全局变量:

#!/bin/bash
​
# Global variable to store the result
output=""
​
# Function definition
function generate_greeting {
  local name=$1  # Function parameter
​
  # Assign the greeting to the global variable
  output="Hello, ${name}!"
}
​
# Call the function with a name as an argument
generate_greeting "$USER"
​
# Access the global variable
echo "${output}"

以上脚本简单地向当前登录的用户问候,当您执行以上脚本时,您可以期望以下输出:

Use global variable to make the bash function return value

现在,让我们分解脚本。

**首先,声明了空的全局变量 **output

**然后,创建了一个名为 **generate_greeting 的函数,它接受一个参数 name ,在接下来的一行中,将带有用户名的问候文本分配给了 output 变量。

**接下来,脚本将调用函数 **generate_meeting 并使用 $USER 参数来获取当前登录用户的名字。

**最后,使用 echo 命令打印了全局变量 **output 的值。

是的,这就是在 bash 中使用全局变量使函数返回值所需的全部。

该使用哪种方法?(在我看来)

我个人不喜欢使用全局变量来使 bash 函数返回一个值,而且有一个简单的原因。

全局变量的特性是可以在脚本的任何地方进行访问和修改,这可能会引起麻烦,特别是如果脚本很复杂,并且可能在用户之间发生变化。

我建议使用第一种方法,它利用标准输出数据流。

希望你会觉得这个指南有用。

Reply Favorite View the author
All Replies
晚秋(lateautumn)
Moderator
2024-04-27 10:27
#1

谢谢分享,只是我看不懂,如果有wps js的经验分享就好了joy

Reply View the author
wlly-lzh
deepin
2024-04-27 10:37
#2

恕我直言,这写的漏洞百出,很多基本概念都没有搞懂。

joy

Reply View the author
ljq790615
deepin
2024-04-27 10:46
#3
It has been deleted!
149*********12
deepin
2024-04-27 10:48
#4
wlly-lzh

恕我直言,这写的漏洞百出,很多基本概念都没有搞懂。

joy

欢迎大佬指正

Reply View the author
wlly-lzh
deepin
2024-04-27 10:57
#5
149*********12

欢迎大佬指正

大可不必

Reply View the author
149*********12
deepin
2024-04-27 11:05
#6
wlly-lzh

大可不必

还是希望大佬多一点分享精神sad

Reply View the author
神末shenmo
Moderator
Spark-App
2024-04-27 14:01
#7

bash的函数相比说是函数,不如理解成一段外部脚本

调用函数就相当于在调用另一个bash脚本

这样看用echo返回就是非常符合直觉的了

Reply View the author
149*********12
deepin
2024-04-27 14:29
#8
神末shenmo

bash的函数相比说是函数,不如理解成一段外部脚本

调用函数就相当于在调用另一个bash脚本

这样看用echo返回就是非常符合直觉的了

有道理agree

Reply View the author
raspbian
deepin
2024-04-27 17:25
#9

这咋看都只是个shell脚本啊

连绑定到标准输出 或者 标准错误都没有

就是个代码片段

那不是想输出啥输出啥

光看标题还以为是能改变$?的内容呢

Reply View the author
水月
deepin
2024-04-27 17:37
#10

返回?

这不就是简单的输出吗?跟返回有什么关系。

要改变bash脚本结束时的返回值,用 exit就好了,这讲的啥呀?

Reply View the author
乾豫恒益
deepin
2024-04-28 09:08
#11

持续学习中。。。

Reply View the author