原文:https://itsfoss.com/bash-function-return-value/
交流群:
与其他编程语言不同,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
,如下所示:
在上面的 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: $?"
正如你所见,它返回 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}"
当执行时,它将给出以下输出:
现在,让我们看看解释部分。
首先,我创建了一个函数 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}"
以上脚本简单地向当前登录的用户问候,当您执行以上脚本时,您可以期望以下输出:
现在,让我们分解脚本。
首先,声明了空的全局变量 output
。
然后,创建了一个名为 generate_greeting
的函数,它接受一个参数 name
,在接下来的一行中,将带有用户名的问候文本分配给了 output
变量。
接下来,脚本将调用函数 generate_meeting
并使用 $USER
参数来获取当前登录用户的名字。
最后,使用 echo 命令打印了全局变量 output
的值。
是的,这就是在 bash 中使用全局变量使函数返回值所需的全部。
该使用哪种方法?(在我看来)
我个人不喜欢使用全局变量来使 bash 函数返回一个值,而且有一个简单的原因。
全局变量的特性是可以在脚本的任何地方进行访问和修改,这可能会引起麻烦,特别是如果脚本很复杂,并且可能在用户之间发生变化。
我建议使用第一种方法,它利用标准输出数据流。
希望你会觉得这个指南有用。