在我的程序中,我试图从函数返回一个值,返回值是字符串。一切正常(至少有一部分),如果我在返回值后回显该值,但如果我不返回,它甚至没有调用该函数……考虑下面的代码……
#!/bin/bash
function get_last_name() {
echo "Get Last Name"
ipath=$1
IFS='/'
set $ipath
for item
do
last=$item
done
echo $last
}
main() {
path='/var/lib/iscsi/ifaces/iface0'
current=$(get_last_name "$path")
echo -n "Current="
echo $current
}
main
它给了我这样的输出
OUTPUT
Current=Get Last Name iface0
如果我评论 echo $current,那么我什至没有看到“Get Last Name”,这使得得出结论,它甚至没有调用该函数。请让我知道我犯了什么错误。但有一件事我敢肯定,bash 是我见过的最丑陋的语言......
最佳答案
函数在 bash 中没有返回值。当你写作时
current=$(get_last_name "$path")
您没有为 current
分配返回值。您正在捕获 get_last_name
的标准输出(使用 echo
命令编写)并将其分配给 current
。这就是为什么您看不到“获取姓氏”的原因;该文本不会到达终端,但会存储在 current
中。
详细解释
让我们先看一下 get_last_name
(稍作修改以简化解释):
function get_last_name () {
ipath=$1
local IFS='/'
set $ipath
for item
do
last=$item
done
echo "Get Last Name"
echo $last
}
我在 IFS
之前添加了 local
命令,以便将更改限制在 get_last_name
的主体中,并且我移动了第一个 echo
到最后以强调两个 echo
语句之间的相似性。当 get_last_name
被调用时,它处理它的单个参数(一个包含文件路径的字符串),然后回显两个字符串:“Get Last Name”和文件路径的最后一个组成部分。如果你要从命令行运行执行这个函数,它会看起来像这样:
$ get_last_name /foo/bar/baz
Get Last Name
baz
函数的退出代码将是最后执行的命令的退出代码,在本例中为 echo $last
。只要写入成功(几乎肯定会成功),它就会为 0。
现在,我们来看函数 main
,它调用 get_last_name
:
main() {
path='/var/lib/iscsi/ifaces/iface0'
current=$(get_last_name "$path")
echo -n "Current="
echo $current
}
就像 get_last_name
一样,main
不会有返回值;它将产生一个退出代码,它是 echo $current
的退出代码。该函数首先在命令替换 ($(...)
) 中调用 get_last_name
,它将捕获来自 get_last_name
的所有标准输出,并且将其视为字符串。
题外话
注意以下区别:
current=$(get_last_name "$path")
将 current
的值设置为 get_last_name
的累积标准输出。 (除其他事项外,输出中的换行符被空格替换,但如何处理空格的完整解释是另一天的主题)。这与返回值无关;请记住,退出代码(bash
必须“返回值”的壁橱东西)是一个整数。
current=get_last_name "$path"
甚至不会调用 get_last_name
。它会将“$path”解释为命令的名称并尝试执行它。该命令将在其环境中有一个变量 current
,其字符串值为“get_last_name”。
重点是,get_last_name
不会“返回”您可以分配给变量的任何内容。它有一个退出代码,并且可以写入标准输出。 $(...)
构造允许您将输出捕获为字符串,然后您可以(除其他事项外)将其分配给变量。
返回main
一旦 current
的值设置为 get_last_name
生成的输出,我们执行
最后两个 echo
语句再次写入标准输出。第一个写“Current=”没有换行符,所以下一个 echo
语句在与第一个相同的行上生成文本。第二个只是回应 current
的值。
当你注释掉 main
的最后一个 echo
时,你并没有阻止 get_last_name
被执行(它已经被执行了) .相反,您只是没有打印 current
变量的内容,get_last_name
的输出被放置在此处而不是终端上。
关于Bash 函数没有被调用,除非我回显返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476656/