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