Linux 在bash函数中返回值

Linux 在bash函数中返回值,linux,bash,Linux,Bash,我正在使用一个不断增长的bash脚本,在这个脚本中我有许多函数。其中一个函数应该返回一个变量值,但我在语法方面遇到了一些问题。下面是一个代码示例 ShowTags() { local tag=0 read tag echo "$tag" } selected_tag=$(ShowTags) echo "$selected_tag" 从Linux杂志的一篇文章中提取了这段代码,但问题是它似乎不起作用,或者它起作用了,我遗漏了一些东西。实际上,每当调用函数时,脚本就会挂起

我正在使用一个不断增长的bash脚本,在这个脚本中我有许多函数。其中一个函数应该返回一个变量值,但我在语法方面遇到了一些问题。下面是一个代码示例

ShowTags() {
    local tag=0
    read tag
    echo "$tag"
}

selected_tag=$(ShowTags)
echo "$selected_tag"
从Linux杂志的一篇文章中提取了这段代码,但问题是它似乎不起作用,或者它起作用了,我遗漏了一些东西。实际上,每当调用函数时,脚本就会挂起并且不输出任何内容,我需要按住CTRL+C键以返回到CLI

有关文章如下

所以我的问题是,这是返回值的正确方法吗?有没有更好或更可靠的方法?如果有,请给我一个例子,这样我就可以不使用全局变量来解决这个问题

编辑:

我现在真的很讨厌这种行为。我正在使用以下脚本

ShowTags() {  

     echo "hi"
     local tag=0
     read tag
     echo "$tag"
}            

selected_tag=$(ShowTags)
echo "$selected_tag

基本上,bash的行为就像read命令发生在函数顶部的echo标记之前一样。一旦我传递了要阅读的内容,它将运行顶部echo,并完成脚本的其余部分。我不知道为什么会这样。这正是我的主脚本中发生的情况。

您正试图使用
名称{…]
定义函数。您必须使用
名称(){…}

ShowTags() {    # add ()
local tag=0
read tag
echo "$tag"
}               # End with }

selected_tag=$(ShowTags)
echo "$selected_tag"
现在,它允许用户键入字符串并将其写回:

$ bash myscript 
hello world     # <- my input
hello world     # script's output
$bash myscript

hello world#正如@that otherguy所指出的,您的函数声明语法是关闭的;但我怀疑这是一个转录错误,好像它在脚本中是错误的,您会遇到不同的问题。我想发生的是,函数中的
read tag
命令试图从标准输入读取值(默认情况下,这是终端),并暂停,直到您键入内容。我不确定它打算做什么,但正如我所写的,我希望它会无限期地暂停,直到键入内容

解决方案:要么键入内容,要么使用非
read
的内容。您还可以添加提示(
read-p“输入标记:”tag
)以更清楚地显示发生了什么

顺便说一句,我对你链接的内容有一些反对意见。这些与你的脚本无关,但你应该注意一些事情

首先,
function
关键字是一个非标准的bashism,我建议不要使用它。
myfunc()…
足以引入函数定义

其次,更严重的是,文章建议以不安全的方式使用
eval
。实际上,安全使用
eval
确实很难(请参阅)。只需更改引用,就可以大大改进它,甚至完全不使用
eval

eval $__resultvar="'$myresult'"    # BAD, can evaluate parts of $myresult as executable code
eval $__resultvar='"$myresult"'    # better, is only vulnerable to executing $__resultvar
declare $__resultvar="$myresult"   # better still
有关更多选项和讨论,请参阅。

echo“hi”
更改为
echo“hi”>/dev/tty

您没有立即看到它的原因是,
$(ShowTags)
捕获函数的所有标准输出,并将其分配给
selected\u tag
。因此,在回显该变量之前,您不会看到任何输出


通过将提示重定向到
/dev/tty
,它总是立即显示在终端上,而不是发送到函数的
stdout
,因此它不会被命令替换捕获。

为什么要编辑问题中的代码?现在它与答案中的代码完全相同,因此答案没有意义。这是复制吗编写问题时出错?我编辑了代码以反映脚本中出现的问题。问题不是语法。当我尝试通过命令替换调用函数时,脚本只是挂断。
read tag
命令正在等待您键入内容。我尝试了,它对我来说很好。键入
selected\u tag后=$(ShowTags)
I键入了一些内容。然后
echo“$selected\u tag”
显示了我键入的内容。我用自己编写的一个快速脚本更新了我的帖子,并更好地解释了bash正在做什么。我只是将它放入一个新脚本中并运行了它,该脚本只是挂起,而不需要用户输入。我在函数开始时加入了一个回音,以查看它是否能够通过,并且没有出现o因为它没有显示。这可能与我的bash的设置方式有关吗?@barefly任何函数回声都将被放入
$selected\u tag
,您将不会在屏幕上看到它。@barefly
回声的输出将与其他输出一起被
$(ShowTags)
捕获。您可以使用stderr(
echo“starting function”>&2
)来绕过这一点(这正是stderr的作用)。谢谢!我很高兴我终于解决了手头的问题。你是个救命恩人。