我正在使用不断增长的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标签之前发生读取命令一样。只要我传递了一些东西来阅读它,它将运行顶部回声,并完成脚本的其余部分。我不确定为什么会这样。这正是我的主要脚本中发生的事情。
答案 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
),以便更清楚地了解正在发生的事情。
首先,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。