在bash函数中返回值

时间:2016-02-08 20:48:51

标签: linux bash

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

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

selected_tag=$(ShowTags)
echo "$selected_tag"

从Linux Journal的文章中提取了这个代码,但问题是它似乎不起作用,或者它确实可以并且我遗漏了一些东西。基本上每当调用该函数时,脚本都会挂起并且不输出任何内容,我需要按CTRL + C退回到CLI。

有问题的文章如下。

http://www.linuxjournal.com/content/return-values-bash-functions

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

编辑:

这种行为现在真的让我感动。我使用以下脚本。

ShowTags() {  

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

selected_tag=$(ShowTags)
echo "$selected_tag

基本上发生的事情是bash会像在函数顶部的echo标签之前发生读取命令一样。只要我传递了一些东西来阅读它,它将运行顶部回声,并完成脚本的其余部分。我不确定为什么会这样。这正是我的主要脚本中发生的事情。

3 个答案:

答案 0 :(得分:2)

echo "hi"更改为echo "hi" >/dev/tty

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

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

答案 1 :(得分:0)

您正尝试使用Name { ... ]定义函数。您必须使用name() { ... }

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

您可以使用read -p "Enter tag: " tag添加提示,以便在撰写输入时更加明显。

答案 2 :(得分:0)

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

解决方案:输入内容,或使用read以外的内容。您还可以添加提示符(read -p "Enter a tag: " tag),以便更清楚地了解正在发生的事情。

顺便说一句,我对你所关联的linux journal article提出了一些异议。这些与您的脚本无关,但您应该注意这些。

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

其次,更严重的是,本文建议以不安全的方式使用eval。实际上,安全使用eval真的很难(见BashFAQ #48)。您可以通过更改引号来改进它,甚至可以完全不使用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

有关更多选项和讨论,请参阅BashFAQ #6