函数在 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
}
我之前添加了local
命令,IFS
以便将更改限制在 的正文中get_last_name
,我将第一个echo
移到末尾以强调两个echo
语句之间的相似性。当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
}
就像 with 一样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
。
当您注释掉 的最后一个echo
时main
,您并没有停止get_last_name
被执行(它已经被执行了)。相反,您只是没有打印current
变量的内容,输出的get_last_name
位置而不是终端上。