除非我回显返回值,否则不会调用Bash函数
在我的程序中,我试图从函数返回一个值,返回值是字符串。如果我在返回值时回显该值,则一切正常(至少在某些部分),但如果我不返回,则它甚至不调用函数。。。。考虑下面的代码……/P>除非我回显返回值,否则不会调用Bash函数,bash,shell,Bash,Shell,在我的程序中,我试图从函数返回一个值,返回值是字符串。如果我在返回值时回显该值,则一切正常(至少在某些部分),但如果我不返回,则它甚至不调用函数。。。。考虑下面的代码……/P> #!/bin/bash function get_last_name() { echo "Get Last Name" ipath=$1 IFS='/' set $ipath for item do last=$i
#!/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")
您没有将返回值分配给当前
。您正在捕获get_last_name
(使用echo
命令编写)的标准输出,并将其分配给current
。这就是为什么你看不到“获取姓氏”;该文本不会发送到终端,而是存储在current
中
详细说明 让我们先浏览一下
get_last_name
(稍作修改以简化解释):
我在IFS
之前添加了local
命令,因此更改仅限于get_last_name
的主体,并将第一个echo
移到末尾,以强调两个echo
语句之间的相似性。调用get\u last\u name
时,它处理其单个参数(一个包含文件路径的字符串),然后回显两个字符串:“get last name”和文件路径的最后一个组件。如果要从命令行运行execute此函数,它将显示如下所示:
$ get_last_name /foo/bar/baz
Get Last Name
baz
函数的退出代码将是最后执行的命令的退出代码,在本例中为echo$last
。只要写入成功(几乎可以肯定会成功),该值将为0
现在,我们来看一下函数main
,它调用get\u last\u 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\u last\u name
的累积标准输出。(除其他事项外,输出中的换行符将替换为空格,但关于如何处理空格的完整解释将是另一天的主题)。这与返回值无关;记住,退出代码(壁橱的东西bash
必须“返回值”)是一个整数
current=get_last_name "$path"
甚至不会调用get\u last\u name
。它会将“$path”解释为命令名并尝试执行它。该命令将在其环境中有一个字符串值为“get_last_name”的变量current
关键是,get\u last\u name
不会“返回”任何可以分配给变量的内容。它有一个退出代码,可以写入标准输出。$(…)
构造允许您将输出捕获为字符串,然后可以(除其他外)将其分配给变量
返回到main
一旦current
的值设置为get_last_name
生成的输出,我们就执行
最后两个echo
语句再次写入标准输出。第一个语句写入“Current=”而不使用换行符,以便下一个echo
语句在与第一个语句相同的行上生成文本。第二个只是回显current
的值
当您注释掉
main
的最后一个echo
时,您没有停止执行get_last_name
(它已经被执行)。相反,您只是没有打印current
变量的内容,而get_last_name
的输出放在该变量的位置,而不是放在终端上。有什么原因不能只打印current=“${path##*/}”
?这将剥离所有内容,包括最后一个/
。另外,您的for
循环缺少in
子句。原因是我只知道C/C++并且我不熟悉正则表达式,我不相信bash的这种不一致输出,所以决定编写自己的逻辑。。。。。但如果你认为这是解决问题的方法。。。。我要试试。。。。。非常感谢…这不是正则表达式,而是大括号扩展(manbash
)即使你不知道bash的大括号扩展,也有外部实用程序basename
。我想,我现在就用它。。。。。。我只是用这种语言(def,不是我的选择,你看)。。。。这样做会很快变得更好……严格说来,这不是真的。它们确实有数字返回码。如果不返回,它将返回上次执行的命令的退出代码。这些是退出代码。您无法直接从函数中获取这些信息;与其他命令一样,您需要检查$?
。OP混淆了标准输出和函数返回值的概念,函数返回值可以构成赋值语句的RHS;然后…。我只是想澄清一下,因为答案并不完全准确。
current=get_last_name "$path"